#
# Copyright (C) 2010-2015, Mellanox Technologies Ltd.  ALL RIGHTS RESERVED.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
#
#

#!/bin/bash

### BEGIN INIT INFO
# Provides:          bsp for particular system
# Short-Description: Mellanox x86 MSN2700 system bsp description
# Available options:
# start        - install all BSP kernel drivers, connect drivers to devices, create BSP dictionary as symbolic
#                links to sysfs entries
# stop         - destroy BSP dictionary, disconnect drivers from devices, uninstall BSP kernel drivers
# restart      - combined stop and start sequence
# reprobe_asic - disconnect ASIC driver from device and connect it again, can be used in case ASIC core
#                driver reloading
### END INIT INFO

. /lib/lsb/init-functions

mux2=/sys/bus/i2c/devices/i2c-2
mux5=/sys/bus/i2c/devices/i2c-5
mux7=/sys/bus/i2c/devices/i2c-7
mux7=/sys/bus/i2c/devices/i2c-8
mux10=/sys/bus/i2c/devices/i2c-10
mux11=/sys/bus/i2c/devices/i2c-11
mux12=/sys/bus/i2c/devices/i2c-12
mux13=/sys/bus/i2c/devices/i2c-13
mux14=/sys/bus/i2c/devices/i2c-14
mux15=/sys/bus/i2c/devices/i2c-15
mux16=/sys/bus/i2c/devices/i2c-16
mux17=/sys/bus/i2c/devices/i2c-17
cpu=/sys/devices/platform/coretemp.0
asic=/sys/bus/i2c/devices/2-0048
cpld=/sys/bus/i2c/devices/2-0060
ucd1=/sys/bus/i2c/devices/5-0027
ucd2=/sys/bus/i2c/devices/5-0041
temp_swb=/sys/bus/i2c/devices/7-004a
temp_mnb=/sys/bus/i2c/devices/7-004b
a2d_swb=/sys/bus/i2c/devices/5-006d
a2d_mnb=/sys/bus/i2c/devices/15-006d
eeprom_mnb=/sys/bus/i2c/devices/16-0051
led=/sys/class/leds/


ACTION=$1

is_module()
{
        /sbin/lsmod | grep -w "$1" > /dev/null
        RC=$?
        return $RC
}

start()
{
	log_daemon_msg "Starting Mellanox x86 system bsp modules" || true

	if is_module lpci2c; then
		log_progress_msg "lpci2c module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe lpci2c 2>/dev/null; then
		log_progress_msg "lpci2c module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "lpci2c module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module i2c_mux; then
		log_progress_msg "i2c_mux module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe i2c_mux 2>/dev/null; then
		log_progress_msg "i2c_mux module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "i2c_mux module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module mlnx_mux_drv; then
		log_progress_msg "mlnx_mux_drv module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe mlnx_mux_drv 2>/dev/null; then
		log_progress_msg "mlnx_mux_drv module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "mlnx_mux_drv module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module mlnx_cpld_drv; then
		log_progress_msg "mlnx_cpld_drv module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe mlnx_cpld_drv 2>/dev/null; then
		log_progress_msg "mlnx_cpld_drv module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "mlnx_cpld_drv module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module mlnx_asic_drv; then
		log_progress_msg "mlnx_asic_drv module has already been loaded" || true
		log_end_msg 0 || true
	fi

	if modprobe mlnx_asic_drv 2>/dev/null; then
		log_progress_msg "mlnx_asic_drv module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "mlnx_asic_drv module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module mlnx_a2d_drv; then
		log_progress_msg "mlnx_a2d_drv module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe mlnx_a2d_drv 2>/dev/null; then
		log_progress_msg "mlnx_a2d_drv module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "mlnx_a2d_drv module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module pmbus_core; then
		log_progress_msg "pmbus_core module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe pmbus_core 2>/dev/null; then
		log_progress_msg "pmbus_core module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "pmbus_core module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module pmbus; then
		log_progress_msg "pmbus module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe pmbus 2>/dev/null; then
		log_progress_msg "pmbus module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "pmbus module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module ucd9200; then
		log_progress_msg "ucd9200 module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe ucd9200 2>/dev/null; then
		log_progress_msg "ucd9200 module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "ucd9200 module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module coretemp; then
		log_progress_msg "coretemp module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe coretemp 2>/dev/null; then
		log_progress_msg "coretemp module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "coretemp module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module lm75; then
		log_progress_msg "lm75 module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe lm75 2>/dev/null; then
		log_progress_msg "lm75 module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "lm75 module load failed" || true
		log_end_msg 1 || true
	fi

	if is_module at24; then
		log_progress_msg "at24 module has already been loaded" || true
		log_end_msg 0 || true
	fi
	if modprobe at24 io_limit=32 2>/dev/null; then
		log_progress_msg "at24 module load passed" || true
		log_end_msg 0 || true
	else
		log_progress_msg "at24 module load failed" || true
		log_end_msg 1 || true
	fi

        if is_module ledtrig-timer; then
                log_progress_msg "ledtrig-timer module has already been loaded" || true
                log_end_msg 0 || true
        fi
        if modprobe ledtrig-timer 2>/dev/null; then
                log_progress_msg "ledtrig-timer module load passed" || true
                log_end_msg 0 || true
        else
                log_progress_msg "ledtrig-timer module load failed" || true
                log_end_msg 1 || true
        fi

        if is_module leds-mlx; then
                log_progress_msg "leds-mlx module has already been loaded" || true
                log_end_msg 0 || true
        fi
        if modprobe leds-mlx 2>/dev/null; then
                log_progress_msg "leds-mlx module load passed" || true
                log_end_msg 0 || true
        else
                log_progress_msg "leds-mlx module load failed" || true
                log_end_msg 1 || true
        fi

}

stop()
{
	log_daemon_msg "Stopping Mellanox x86 system bsp module" || true

        if is_module leds-mlx; then
                if rmmod leds-mlx 2>/dev/null ; then
                        log_progress_msg "leds-mlx module is unloaded" || true
                        log_end_msg 0 || true
                else
                        log_progress_msg "leds-mlx module unload failed" || true
                        log_end_msg 1 || true
                fi
        else
                log_progress_msg "No leds-mlx module loaded" || true
                log_end_msg 0 || true
        fi

        if is_module ledtrig-timer; then
                if rmmod ledtrig-timer 2>/dev/null ; then
                        log_progress_msg "ledtrig-timer module is unloaded" || true
                        log_end_msg 0 || true
                else
                        log_progress_msg "ledtrig-timer module unload failed" || true
                        log_end_msg 1 || true
                fi
        else
                log_progress_msg "No ledtrig-timer module loaded" || true
                log_end_msg 0 || true
        fi

	if is_module at24; then
		if rmmod at24 2>/dev/null ; then
			log_progress_msg "at24 module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "at24 module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No at24 module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module lm75; then
		if rmmod lm75 2>/dev/null ; then
			log_progress_msg "lm75 module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "lm75 module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No lm75 module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module coretemp; then
		if rmmod coretemp 2>/dev/null ; then
			log_progress_msg "coretemp module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "coretemp module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No coretemp module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module ucd9200; then
		if rmmod ucd9200 2>/dev/null ; then
			log_progress_msg "ucd9200 module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "ucd9200 module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No ucd9200 module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module pmbus; then
		if rmmod pmbus 2>/dev/null ; then
			log_progress_msg "pmbus module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "pmbus module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No pmbus module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module pmbus_core; then
		if rmmod pmbus_core 2>/dev/null ; then
			log_progress_msg "pmbus_core module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "pmbus_core module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No pmbus_core module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module mlnx_a2d_drv; then
		if rmmod mlnx_a2d_drv 2>/dev/null ; then
			log_progress_msg "mlnx_a2d_drv module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "mlnx_a2d_drv module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No mlnx_a2d_drv module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module mlnx_asic_drv; then
		if rmmod mlnx_asic_drv 2>/dev/null ; then
			log_progress_msg "mlnx_asic_drv module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "mlnx_asic_drv module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No mlnx_aisc_drv module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module mlnx_cpld_drv; then
		if rmmod mlnx_cpld_drv 2>/dev/null ; then
			log_progress_msg "mlnx_cpld_drv module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "mlnx_cpld_drv module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No mlnx_cpld_drv module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module mlnx_mux_drv; then
		if rmmod mlnx_mux_drv 2>/dev/null ; then
			log_progress_msg "mlnx_mux_drv module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "mlnx_mux_drv module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No mlnx_mux_drv module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module i2c_mux; then
		if rmmod i2c_mux 2>/dev/null ; then
			log_progress_msg "i2c_mux module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "i2c_mux module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No i2c_mux module loaded" || true
		log_end_msg 0 || true
	fi

	if is_module lpci2c; then
		if rmmod lpci2c 2>/dev/null ; then
			log_progress_msg "lpci2c module is unloaded" || true
			log_end_msg 0 || true
		else
			log_progress_msg "lpci2c module unload failed" || true
			log_end_msg 1 || true
		fi
	else
		log_progress_msg "No lpci2c module loaded" || true
		log_end_msg 0 || true
	fi
	return 0
}

connect_platform()
{
        if [ ! -d $cpld ]; then
            echo mlnx-cpld-drv 0x60 > /sys/bus/i2c/devices/i2c-2/new_device
        fi
        if [ ! -d $asic ]; then
            echo asic_drv_16_ports 0x48 > /sys/bus/i2c/devices/i2c-2/new_device
            attr=`ls $asic/hwmon`
            asic=$asic/hwmon/$attr
        fi
        if [ ! -d $ucd1 ]; then
            echo ucd9200 0x27 > /sys/bus/i2c/devices/i2c-5/new_device
            attr=`ls $ucd1/hwmon`
            ucd1=$ucd1/hwmon/$attr
        fi
        if [ ! -d $ucd2 ]; then
            echo ucd9200 0x41 > /sys/bus/i2c/devices/i2c-5/new_device
            attr=`ls $ucd2/hwmon`
            ucd1=$ucd2/hwmon/$attr
        fi
        if [ ! -d $a2d_swb ]; then
            echo mlnxa2dswb 0x6d > /sys/bus/i2c/devices/i2c-5/new_device
        fi
        if [ ! -d $temp_swb ]; then
            echo lm75 0x4a > /sys/bus/i2c/devices/i2c-7/new_device
            tmp_temp_swb=`ls $temp_swb/hwmon`
            tmp_temp_swb=$temp_swb/hwmon/$attr
            if [ -f $tmp_temp_swb/name ]; then
                temp_swb=$tmp_temp_swb
            fi
        fi
        if [ ! -d $a2d_mnb ]; then
            echo mlnxa2dmnb 0x6d > /sys/bus/i2c/devices/i2c-15/new_device
        fi
        if [ ! -d /sys/bus/i2c/devices/16-0051 ]; then
            echo 24c32 0x51 > /sys/bus/i2c/devices/i2c-16/new_device
        fi
        if [ ! -d $temp_mnb ]; then
            echo lm75 0x4b > /sys/bus/i2c/devices/i2c-7/new_device
            tmp_temp_mnb=`ls $temp_mnb/hwmon`
            tmp_temp_mnb=$temp_mnb/hwmon/$attr
            if [ -f $tmp_temp_mnb/name ]; then
                temp_mnb=$tmp_temp_mnb
            fi
        fi
}

disconnect_platform()
{
        if [ -d $temp_mnb ]; then
                echo 0x4b > /sys/bus/i2c/devices/i2c-7/delete_device
        fi
        if [ -d /sys/bus/i2c/devices/16-0051 ]; then
            echo 0x51 > /sys/bus/i2c/devices/i2c-16/delete_device
        fi
        if [ -d $a2d_mnb ]; then
            echo 0x6d > /sys/bus/i2c/devices/i2c-15/delete_device
        fi
        if [ -d $temp_swb ]; then
                echo 0x4a > /sys/bus/i2c/devices/i2c-7/delete_device
        fi
        if [ -d /sys/bus/i2c/devices/6-006d ]; then
            echo 0x6d > /sys/bus/i2c/devices/i2c-5/delete_device
        fi
        if [ -d $ucd2 ]; then
            echo 0x41 > /sys/bus/i2c/devices/i2c-5/delete_device
        fi
        if [ -d $ucd1 ]; then
            echo 0x27 > /sys/bus/i2c/devices/i2c-5/delete_device
        fi
        if [ -d $asic ]; then
            echo 0x48 > /sys/bus/i2c/devices/i2c-2/delete_device
        fi
        if [ -d $cpld ]; then
            echo 0x60 > /sys/bus/i2c/devices/i2c-2/delete_device
        fi
}

case $ACTION in
        start)
                start
                connect_platform

                if [ ! -d /bsp/power ]; then
                    mkdir -p /bsp/power
                fi
                if [ ! -d /bsp/thermal ]; then
                    mkdir -p /bsp/thermal
                fi
                if [ ! -d /bsp/fan ]; then
                    mkdir -p /bsp/fan
                fi
                if [ ! -d /bsp/module ]; then
                    mkdir -p /bsp/module
                fi
                if [ ! -d /bsp/cpld ]; then
                    mkdir -p /bsp/cpld
                fi
                if [ ! -d /bsp/led ]; then
                    mkdir -p /bsp/led
                fi
                if [ ! -d /bsp/system ]; then
                    mkdir -p /bsp/system
                fi
                if [ ! -d /bsp/eeprom ]; then
                    mkdir -p /bsp/eeprom
                fi
                if [ ! -d /bsp/qsfp ]; then
                    mkdir -p /bsp/qsfp
                fi
                if [ ! -d /bsp/thermal_zone1 ]; then
                    mkdir -p /bsp/thermal_zone1
                fi

                # Thermal
                attr=`find $cpu/ -name temp1_input`
                if [ ! -L /bsp/thermal/cpu_pack ]; then
                    ln -s $attr /bsp/thermal/cpu_pack
                fi
                attr=`find $cpu/ -name temp2_input`
                if [ ! -L /bsp/thermal/cpu_core0 ]; then
                    ln -s $attr /bsp/thermal/cpu_core0
                fi
                attr=`find $cpu/ -name temp3_input`
                if [ ! -L /bsp/thermal/cpu_core1 ]; then
                    ln -s $attr /bsp/thermal/cpu_core1
                fi
                attr=`find $temp_swb/ -name temp1_input`
                if [ ! -L /bsp/thermal/port_amb ]; then
                    ln -s $attr /bsp/thermal/port_amb
                fi
                attr=`find $temp_mnb/ -name temp1_input`
                if [ ! -L /bsp/thermal/board_amb ]; then
                    ln -s $attr /bsp/thermal/board_amb
                fi
                if [ ! -L /bsp/thermal/asic ]; then
                    ln -s $asic/temp1_input /bsp/thermal/asic
                fi

                # FAN
                fan_array=(1 2 3 4 5 6 7 8)
                for i in ${fan_array[*]}
                do
                        if [ ! -L /bsp/fan/fan"$i"_speed_get ]; then
                            ln -s $asic/fan"$i"_input /bsp/fan/fan"$i"_speed_get
                        fi
                        if [ ! -L /bsp/fan/fan"$i"_speed_set ]; then
                            ln -s $asic/pwm"$i" /bsp/fan/fan"$i"_speed_set
                        fi
                        if [ ! -L /bsp/fan/fan"$i"_min ]; then
                            ln -s $asic/fan"$i"_min /bsp/fan/fan"$i"_min
                        fi
                        if [ ! -L /bsp/fan/fan"$i"_max ]; then
                            ln -s $asic/fan"$i"_max /bsp/fan/fan"$i"_max
                        fi
                        if [ ! -L /bsp/fan/fan"$i"_enable ]; then
                            ln -s $asic/fan"$i"_enable /bsp/fan/fan"$i"_enable
                        fi
                done

                # LED
                led_fan_array=(1)
                for i in ${led_fan_array[*]}
                do
                    if [ ! -L /bsp/led/led_fan"$i" ]; then
                        ln -s $cpld/led"$i" /bsp/led/led_fan"$i"
                    fi
                    if [ ! -L /bsp/led/led_fan"$i"_capability ]; then
                            ln -s $cpld/led"$i"_capability /bsp/led/led_fan"$i"_capability
                    fi
                done

                led_psu_array=(2 3)
                for i in ${led_psu_array[*]}
                do
                    if [ ! -L /bsp/led/led_psu"$i" ]; then
                        ln -s $cpld/led"$i" /bsp/led/led_psu"$[$i-1]"
                    fi
                    if [ ! -L /bsp/led/led_psu"$i"_capability ]; then
                            ln -s $cpld/led"$i"_capability /bsp/led/led_psu"$[$i-1]"_capability
                    fi
                done

                if [ ! -L /bsp/led/led_status ]; then
                    ln -s $cpld/led4 /bsp/led/led_status
                fi
                if [ ! -L /bsp/led/led_status_capability ]; then
                    ln -s $cpld/led4_capability /bsp/led/led_status_capability
                fi

                if [ ! -L /bsp/led/led_uid ]; then
                    ln -s $cpld/led5 /bsp/led/led_uid
                fi
                if [ ! -L /bsp/led/led_uid_capability ]; then
                    ln -s $cpld/led5_capability /bsp/led/led_uid_capability
                fi

                # CPLD
                if [ ! -L /bsp/cpld/cpld_mgmt_version ]; then
                    ln -s $cpld/cpld1_version /bsp/cpld/cpld_mgmt_version
                fi
                if [ ! -L /bsp/cpld/cpld_brd_version ]; then
                    ln -s $cpld/cpld2_version /bsp/cpld/cpld_brd_version
                fi
                if [ ! -L /bsp/cpld/cpld_port_version ]; then
                    ln -s $asic/cpld3_version /bsp/cpld/cpld_port_version
                fi

                # Module
                fan_array=(1 2 3 4)
                for i in ${fan_array[*]}
                do
                    if [ ! -L /bsp/module/fan"$i"_status ]; then
                       ln -s $cpld/fan"$i"_status /bsp/module/fan"$i"_status
                    fi
                    if [ ! -L /bsp/module/fan"$i"_event ]; then
                        ln -s $cpld/fan"$i"_event /bsp/module/fan"$i"_event
                    fi
                    if [ ! -L /bsp/module/fan"$i"_mask ]; then
                        ln -s $cpld/fan"$i"_mask /bsp/module/fan"$i"_mask
                    fi
                done

                # System
                if [ ! -L /bsp/system/power_cycle ]; then
                    ln -s $cpld/sys_pwr_cycle1 /bsp/system/power_cycle
                fi
                if [ ! -L /bsp/system/reset_reason ]; then
                    ln -s $cpld/reset_cause1 /bsp/system/reset_reason
                fi

                # EEPROM
                if [ ! -L /bsp/eeprom/cpu_info ]; then
                    attr=`find $eeprom_mnb/ -name eeprom`
                    if [ -e $attr ]; then
                        ln -s $attr /bsp/eeprom/cpu_info
                    fi
                fi

               # QSFP
                qsfp_array=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)
                for i in ${qsfp_array[*]}
                do
                    if [ ! -L /bsp/qsfp/qsfp"$i" ]; then
                       ln -s $asic/qsfp"$i"_eeprom /bsp/qsfp/qsfp"$i"
                    fi
                done

                for i in ${qsfp_array[*]}
                do
                    if [ ! -L /bsp/qsfp/qsfp"$i"_status ]; then
                       ln -s $asic/qsfp"$i"_status /bsp/qsfp/qsfp"$i"_status
                    fi
                done

                # Thermal zone control
                if [ ! -L /bsp/thermal_zone1/thermal_control_activate ]; then
                    if [ -f  /usr/sbin/thermal_watch_start.sh ]; then
                        ln -s /usr/sbin/thermal_watch_start.sh /bsp/thermal_zone1/thermal_control_activate
                    fi
                fi
                if [ ! -L /bsp/thermal_zone1/thermal_control_deactivate ]; then
                    if [ -f  /usr/sbin/thermal_watch_stop.sh ]; then
                        ln -s /usr/sbin/thermal_watch_stop.sh /bsp/thermal_zone1/thermal_control_deactivate
                    fi
                fi
        ;;
        stop)

                # Thermal
                if [ -L /bsp/thermal/cpu_pack ]; then
                    rm -rf /bsp/thermal/cpu_pack
                fi
                if [ -L /bsp/thermal/cpu_core0 ]; then
                    rm -rf /bsp/thermal/cpu_core0
                fi
                if [ -L /bsp/thermal/cpu_core1 ]; then
                    rm -rf /bsp/thermal/cpu_core1
                fi
                if [ -L /bsp/thermal/port_amb ]; then
                    rm -rf /bsp/thermal/port_amb
                fi
                if [ -L /bsp/thermal/board_amb ]; then
                    rm -rf /bsp/thermal/board_amb
                fi
                if [ -L /bsp/thermal/asic ]; then
                    rm -rf /bsp/thermal/asic
                fi

                # FAN
                fan_array=(1 2 3 4 5 6 7 8)
                for i in ${fan_array[*]}
                do
                    if [ -L /bsp/fan/fan"$i"_speed_get ]; then
                        rm -rf /bsp/fan/fan"$i"_speed_get
                    fi
                    if [ -L /bsp/fan/fan"$i"_speed_set ]; then
                        rm -rf /bsp/fan/fan"$i"_speed_set
                    fi
                    if [ -L /bsp/fan/fan"$i"_min ]; then
                        rm -rf /bsp/fan/fan"$i"_min
                    fi
                    if [ -L /bsp/fan/fan"$i"_max ]; then
                        rm -rf /bsp/fan/fan"$i"_max
                    fi
                    if [ -L /bsp/fan/fan"$i"_enable ]; then
                        rm -rf /bsp/fan/fan"$i"_enable
                    fi
                done

                # LED
                led_fan_array=(1)
                for i in ${led_fan_array[*]}
                do
                   if [ -L /bsp/led/led_fan"$i" ]; then
                        rm -rf /bsp/led/led_fan"$i"
                   fi
                   if [ -L /bsp/led/led_fan"$i"_capability ]; then
                        rm -rf /bsp/led/led_fan"$i"_capability
                    fi
                done

                led_fan_array=(2 3)
                for i in ${led_psu_array[*]}
                do
		   j = i -1
                   if [ -L /bsp/led/led_psu"$i" ]; then
                        rm -rf /bsp/led/led_psu"$[$i-1]"
                   fi
                   if [ -L /bsp/led/led_psu"$i"_capability ]; then
                        rm -rf /bsp/led/led_psu"$[$i-1]"_capability
                    fi
                done

                if [ -L /bsp/led/led_status ]; then
                    rm -rf /bsp/led/led_status
                fi
                if [ -L /bsp/led/led_status_capability ]; then
                    rm -rf /bsp/led/led_status_capability
                fi

                if [ -L /bsp/led/led_uid ]; then
                    rm -rf /bsp/led/led_uid
                fi
                if [ -L /bsp/led/led_uid_capability ]; then
                    rm -rf /bsp/led/led_uid_capability
                fi

                # CPLD
                if [ -L /bsp/cpld/cpld_mgmt_version ]; then
                    rm -rf /bsp/cpld/cpld_mgmt_version
                fi
                if [ -L /bsp/cpld/cpld_brd_version ]; then
                    rm -rf /bsp/cpld/cpld_brd_version
                fi
                if [ -L /bsp/cpld/cpld_port_version ]; then
                    rm -rf /bsp/cpld/cpld_port_version
                fi

                # Module
                fan_array=(1 2 3 4)
                for i in ${fan_array[*]}
                do
                    if [ -L /bsp/module/fan"$i"_status ]; then
                        rm -rf /bsp/module/fan"$i"_status
                    fi
                    if [ -L /bsp/module/fan"$i"_event ]; then
                        rm -rf /bsp/module/fan"$i"_event
                    fi
                    if [ -L /bsp/module/fan"$i"_mask ]; then
                        rm -rf /bsp/module/fan"$i"_mask
                    fi
                done

                psu_array=(1 2)
                for i in ${psu_array[*]}
                do
                    if [ -L /bsp/module/psu"$i"_pwr_status ]; then
                        rm -rf /bsp/module/psu"$i"_pwr_status
                    fi
                    if [ -L /bsp/module/psu"$i"_pwr_event ]; then
                        rm -rf /bsp/module/psu"$i"_pwr_event
                    fi
                    if [ -L /bsp/module/psu"$i"_pwr_mask ]; then
                        rm -rf /bsp/module/psu"$i"_pwr_mask
                    fi
                done

                # System
                if [ -L /bsp/system/power_cycle ]; then
                    rm -rf /bsp/system/power_cycle
                fi
                if [ -L /bsp/system/reset_reason ]; then
                    rm -rf /bsp/system/reset_reason
                fi

                # EEPROM
                if [ -L /bsp/eeprom/cpu_info ]; then
                    rm -rf /bsp/eeprom/cpu_info
                fi
                if [ -L /bsp/eeprom/fan1_info ]; then
                    rm -rf /bsp/eeprom/fan1_info
                fi
                if [ -L /bsp/eeprom/fan2_info ]; then
                    rm -rf /bsp/eeprom/fan2_info
                fi
                if [ -L /bsp/eeprom/fan3_info ]; then
                    rm -rf /bsp/eeprom/fan3_info
                fi
                if [ -L /bsp/eeprom/fan4_info ]; then
                    rm -rf /bsp/eeprom/fan4_info
                fi

               # QSFP
                qsfp_array=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)
                for i in ${qsfp_array[*]}
                do
                    if [ -L /bsp/qsfp/qsfp"$i" ]; then
                       rm -rf /bsp/qsfp/qsfp"$i"
                    fi
                done

                for i in ${qsfp_array[*]}
                do
                    if [ -L /bsp/qsfp/qsfp"$i"_status ]; then
                       rm -rf /bsp/qsfp/qsfp"$i_status"
                    fi
                done

                # Thermal zone control
                if [ -L /bsp/thermal_zone1/thermal_control_activate ]; then
                    rm -rf /bsp/thermal_zone1/thermal_control_activate
                fi
                if [ -L /bsp/thermal_zone1/thermal_control_deactivate ]; then
                    rm -rf /bsp/thermal_zone1/thermal_control_deactivate
                fi
                if [ -d /bsp/power ]; then
                    rm -rf /bsp/power
                fi
                if [ -d /bsp/thermal ]; then
                    rm -rf /bsp/thermal
                fi
                if [ -d /bsp/fan ]; then
                    rm -rf /bsp/fan
                fi
                if [ -d /bsp/module ]; then
                    rm -rf /bsp/module
                fi
                if [ -d /bsp/cpld ]; then
                    rm -rf /bsp/cpld
                fi
                if [ -d /bsp/led ]; then
                    rm -rf /bsp/led
                fi
                if [ -d /bsp/system ]; then
                    rm -rf /bsp/system
                fi
                if [ -d /bsp/eeprom ]; then
                    rm -rf /bsp/eeprom
                fi
                if [ -d /bsp/qsfp ]; then
                    rm -rf /bsp/qsfp
                fi
                if [ -d /bsp/thermal_zone1 ]; then
                    rm -rf /bsp/thermal_zone1
                fi

                disconnect_platform
                stop
        ;;
        restart)
                stop
                start
        ;;
        reprobe_asic)
                if [ -d $asic ]; then
                    echo 0x48 > /sys/bus/i2c/devices/i2c-2/delete_device
                fi
                echo asic_drv_16_ports 0x48 > /sys/bus/i2c/devices/i2c-2/new_device
        ;;
        status)
                status
        ;;
        *)
                echo
                echo "Usage: `basename $0` {start|stop|restart|reprobe_asic}"
                echo
                exit 1
        ;;
esac
