#!/bin/bash

# Find modinfo
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/opt/bin

CIMPROVIDER="MLNX_CIMProvider"
CIM_VERSION="1.2.2"
LIGHT=${LIGHT:-"no"}

nop()
{
    echo
}

fbin()
{
    FBIN=`which $1 2>&1`
    [ ! -x "$FBIN" ] && FBIN="nop"
    echo $FBIN
}

getmodfilename()
{
    if [ "$MODINFO" != "nop" ]; then
        $MODINFO $1 2>&1 | $SED -ne 's/filename:\s*//p'
    fi
}

getmodver()
{
    if [ "$MODINFO" != "nop" ]; then
        $MODINFO $1 | $SED -ne 's/version:\s*\([1-9]\(\.[0-9]\)\+\).*/\1/p'
    else
        echo "NA"
    fi
}

getver()
{
    echo $1 | $SED -ne 's/.*\s* \([1-9]\(\.[0-9]\)\+\).*/\1/p'
}

getfiletime()
{
    if [ "$STAT" != "nop" ]; then
        $STAT -c '%z' $1 2> /dev/null |  $SED -e 's/\.[0-9]\+\s\++[0-9]/.000000+/' | $SED -e 's/[-\ :]//g'
    else
        echo "00000000000000.000000+000"
    fi

}

gettoken()
{
    MATCH=`echo "s@.*$1\\s*\\+$2\\s*\\(\\S\\+\\)\\s.*@\\1@p"`
    echo $3 | $SED -ne "$MATCH"
}

getWidth()
{
    echo $1 | $SED 's/\.*\([0-9]*\)X/\1/'
}

getEnabledSpeed()
{
    echo $1 | $SED -ne 's@.*LinkSpeedEnabled:.*\([1-9][0-9]\+\.[0-9]\+\)\s.*@\1@p'
}

getExtendedEnabledSpeed()
{
    if [ "X$LIGHT" != "Xyes" ]; then
        echo $1 | $SED -ne 's@.*LinkSpeedExtEnabled:.*\([1-9][0-9]\+\.[0-9]\+\)\s.*@\1@p'
    else
        case $1 in
            *SDR*)
            echo 2.5
            ;;
            *DDR*)
            echo 5
            ;;
            *QDR*|*FDR10*)
            echo 10
            ;;
            *FDR*)
            echo 14.0625
            ;;
            *EDR*)
            echo 25
            ;;
        esac
    fi
}

getrpminfo() 
{
    rinfo=`$RPM -q -i --whatprovides $1 2>&1` || return 1

    BASEN=`basename $1`
    VERSION=`gettoken "$2" ":" "$rinfo" | sed -ne 's/[^0-9]*\(\([0-9]\|\.\|\-\)*[0-9]\).*/\1/p'`
    MAJOR=`getmajor $VERSION`
    MINOR=`getminor $VERSION`
    REV=`getrev $VERSION`
    GTIME=`echo $rinfo | $SED -ne 's/.*Install Date:\s*\(.*\)\s*Build.*/\1/p' | $SED -e 's@,@\ @g'`
    TIME=`date -d "$GTIME"  '+%Y%m%d%H%M%S.000000%z' | sed -e 's/0\(...\)$/\1/'`
    SUMM=`echo $rinfo | $SED -n 's@.*Summary\s*:\s*\(.*\)\s\+Description.*@\1@p'`

    if `echo $1 | grep -qi mlx4_core`; then
        PACK=`gettoken "Packager" ":" "$rinfo"`
        if `echo $PACK | grep -qi red` || `echo $PACK | grep -qi suse`; then
            VERSION=1.0.0;MAJOR=0;MINOR=0;REV=0;
        fi
        SUMM="Mellanox ConnectX MLX4 Driver"
    fi

    echo  "type=rpm;status=$STATUS;module=$BASEN;version=$VERSION;major=$MAJOR;minor=$MINOR;rev=$REV;datetime=$TIME;description=$SUMM"

    if [ "$1" = $CIMPROVIDER ]; then
        echo  "type=rpm;status=$STATUS;module=MLNX_DiagnosticTestEthernetPort;version=$VERSION;major=$MAJOR;minor=$MINOR;rev=$REV;datetime=$TIME;description=Mellanox IB Port Diagnostic Test"

        echo  "type=rpm;status=$STATUS;module=MLNX_DiagnosticTestIBPort;version=$VERSION;major=$MAJOR;minor=$MINOR;rev=$REV;datetime=$TIME;description=Mellanox Ethernet Port Diagnostic Test"
    fi
}


getinfo() {

    module=$1
    file=$module

    case "$module" in
        *mlx4_core*)
            VERSION=`$OFED_INFO -s | sed -ne 's/[^0-9]*\(\([0-9]\|\.\|\-\)*[0-9]\).*/\1/p' | sed -e 's/-/./'`
            SUMM="Mellanox ConnectX MLX4 Driver"
        ;;
	*mlx5_core*)
            VERSION=`$OFED_INFO -s | sed -ne 's/[^0-9]*\(\([0-9]\|\.\|\-\)*[0-9]\).*/\1/p' | sed -e 's/-/./'`
            SUMM="Mellanox ConnectX MLX5 Driver"
        ;;

        mst)
            VERSION=`$MSTFLINT -v | awk '{print $3}' | sed -ne 's/[^0-9]*\(\([0-9]\|\.\)*[0-9]\).*/\1/p' | sed -e 's/-/./'`
            SUMM="Mellanox firmware tools"
            file=$MSTFLINT
        ;;
        *MLNX_CIM*)
            VERSION=$CIM_VERSION
            SUMM="Mellanox CIM Providers Package"
            file="/usr/lib64/libMLNX_CIMProvider.so"
        ;;
        *MLNX_Diag*)
            VERSION=$CIM_VERSION
            SUMM="Mellanox Ethernet Port Diagnostic Test"
            file="/usr/lib64/libMLNX_CIMProvider.so"
        ;;
    esac

    BASEN=`basename $module`
    MAJOR=`getmajor $VERSION`
    MINOR=`getminor $VERSION`
    REV=`getrev $VERSION`
    TIME=`getfiletime $file`

    if `echo $module | grep -qi mlx4_core`; then
        if `echo $1 | grep -qvE "updates|extra"`; then
	     getmodver mlx4_core
	     VERSION=($result)
        fi
    fi

    echo  "type=rpm;status=$STATUS;module=$BASEN;version=$VERSION;major=$MAJOR;minor=$MINOR;rev=$REV;datetime=$TIME;description=$SUMM"

    if [ "$module" = $CIMPROVIDER ]; then
        echo  "type=rpm;status=$STATUS;module=MLNX_DiagnosticTestEthernetPort;version=$VERSION;major=$MAJOR;minor=$MINOR;rev=$REV;datetime=$TIME;description=Mellanox IB Port Diagnostic Test"

        echo  "type=rpm;status=$STATUS;module=MLNX_DiagnosticTestIBPort;version=$VERSION;major=$MAJOR;minor=$MINOR;rev=$REV;datetime=$TIME;description=Mellanox Ethernet Port Diagnostic Test"
    fi
}


getmajor() {
    [ ! -f $SED ] && echo 0 && return 0
    echo $1 | $SED -ne 's/\([0-9]\+\)\..*/\1/p'
}

getminor() {
    [ ! -f $SED ] && echo 0 && return 0
    echo $1 | $SED -ne 's/[0-9]\+\.\([0-9]\+\)\..*/\1/p'
}

getrev() {
    [ ! -f $SED ] && echo 0 && return 0
    echo $1 | $SED -ne 's/[0-9]\+\.[0-9]\+\.\(\([0-9]\|\.\|\-\)*\)\.\?.*/\1/p'
}





SMPQUERY=`fbin smpquery`
MODINFO=`fbin modinfo`
MODPROBE=`fbin modprobe`
DEPMOD=`fbin depmod`
LSMOD=`fbin lsmod`
UNAME=`fbin uname`
FLINT=`fbin flint`
GREP=`fbin grep`
STAT=`fbin stat`
SED=`fbin sed`
LSPCI=`fbin lspci`
IBSTAT=`fbin ibstat`
IBPORTSTATE=`fbin ibportstate`
IFCONFIG=`fbin ifconfig`
MSTFLINT=`fbin mstflint.cim`
OFED_INFO=`fbin ofed_info`
OFED_RPM_INFO=`fbin ofed_rpm_info`
RPM=`fbin rpm`
DMIDECODE=`fbin dmidecode`
HOSTNAME=`hostname`
if [ "X$MSTFLINT" = "Xnop" ]; then
    MSTFLINT=`fbin mstflint`
fi


UREV=`$UNAME -r`

MODNAMES="mlx4_core mlx5_core"
MODDIR="/lib/modules/$UREV"


listpkg()
{
	COUNTER=1; 
	DEVLS=`$LSPCI -n -d $VENDID: | sed -ne 's/\([0-9]*.*\.0\).*/\1/p'`
	for DEV in $DEVLS
    	do
	SN=$(getDeviceSerialNumber)
	NG=$(getNodeGUID)
        SMPOUT=`$SMPQUERY portinfo -D $NG`
        DIAGCODE=`gettoken "DiagCode" ":" "$SMPOUT"`
	DIAGCODE_DEC=`echo "$DIAGCODE" | sed -ne  's/\.//gp'`
	DIAGCODE_DEC=`echo "$DIAGCODE_DEC" | sed -ne  's/\0x//gp'`
	FOUT=`$MSTFLINT -d $DEV -qq q`
	PSID=`echo  $FOUT | $SED -ne 's/.*PSID:\s*\(\S*\).*/\1/p'`
#	SYSNAME=$HOSTNAME
	COUNTER=$((COUNTER+1))

	echo -n "serial=$SN;nodeGUID=$NG;diag_code=$DIAGCODE_DEC;psid=$PSID;hostname=$HOSTNAME;counter=$COUNTER"	
	done
	echo
}

listsoftware() 
{
    if [ "X$LIGHT" != "Xyes" ]; then
        # Get Version Of Linux Modules
        for MODULE in $MODNAMES; do
            FILENAME=`getmodfilename $MODULE`
            if [ -e "$FILENAME" ]; then
                MODFILES+=" $FILENAME"
            fi
        done

        for MF in $MODFILES; do
            getinfo $MF Release
        done

        RPMFILES+=" /usr/bin/mst"
        for RPMFILE in $RPMFILES; do
            getrpminfo $RPMFILE Version
        done

        getrpminfo $CIMPROVIDER Version
    else
        for MODULE in $MODNAMES; do
            FILENAME=`getmodfilename $MODULE`
            if [ -e "$FILENAME" ]; then
                MODFILES+=" $FILENAME"
            fi
        done

        for MF in $MODFILES; do
            getinfo $MF Release
        done
        getinfo mst Version
        getinfo $CIMPROVIDER Version
    fi
}

getmstdevid(){
    SUCC= mst start | mst status | grep -B1 $DEV | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }'| grep 'pciconf' | grep -o '^\S*'
}
export VENDID=15b3
listfirmware()
{
    [ "$MSTFLINT" = "nop" ] && return
    DEVLS=`$LSPCI -n -d $VENDID: | sed -ne 's/\([0-9]*.*\.0\).*/\1/p'`
    for DEV in $DEVLS
    do
	MSTDEVID=$(getmstdevid)
       	BUS=`echo $DEV | sed -ne 's/^\(\S\S\?\).*/\1/p'`
        DV=`echo $DEV | sed -ne 's/^..:\(\S\S\?\)\..*/\1/p'`
        FOUT=`$MSTFLINT -d $DEV -qq q`
        if [ $? != 0 ]; then
            continue
        fi
        ITYPE=`echo  $FOUT | $SED -ne 's/.*Image\s\+type:\s*\(\S*\).*/\1/p'`
        FWVER=`echo  $FOUT | $SED -ne 's/.*FW\sVersion:\s*\(\S*\).*/\1/p'`
        MAJOR=`getmajor $FWVER`
        MINOR=`getminor $FWVER`
        REV=`getrev $FWVER`
        DEVID=`echo  $FOUT | $SED -ne 's/.*Device\sID:\s*\(\S*\).*/\1/p'`
        CHIPREV=`echo  $FOUT | $SED -ne 's/.*Revision\s*:\s*\(\S*\).*/\1/p'`
        MACP1=`echo  $FOUT | $SED -ne 's/.*MACs:\s*\(\S*\)\s*\(\S*\).*/\1/p'`
        MACP2=`echo  $FOUT | $SED -ne 's/.*MACs:\s*\(\S*\)\s*\(\S*\).*/\2/p'`
        GUIDP1=`echo  $FOUT | $SED -ne 's/.*GUIDs:\s*\(\S*\)\s*\(\S*\)\s*\(\S*\)\s*\(\S*\)\s*.*/\2/p'`
        GUIDP2=`echo  $FOUT | $SED -ne 's/.*GUIDs:\s*\(\S*\)\s*\(\S*\)\s*\(\S*\)\s*\(\S*\)\s*.*/\3/p'`
        PSID=`echo  $FOUT | $SED -ne 's/.*PSID:\s*\(\S*\).*/\1/p'`
        echo -n "type=flint;bus=$BUS;dev=$DV;fn=0;image=$ITYPE;devid=$DEVID;chiprev=$CHIPREV;"
        echo -n "fwver=$FWVER;major=$MAJOR;minor=$MINOR;rev=$REV;"
        echo -n "macp1=$MACP1;macp2=$MACP2;guidp1=$GUIDP1;guidp2=$GUIDP2;psid=$PSID;mstdevid=$MSTDEVID"
        echo 
    done
}

listibports() {
if [ "X${LIGHT}" != "Xyes" ]; then
    for DEVNAME in  `$IBSTAT -l`; do
        #for all devices (mlx4_X)
        STATOUT=`$IBSTAT $DEVNAME`
        NUMBER_OF_PORTS=`gettoken "Number of ports" ":" "$STATOUT"`
        for ((PORT = 1; PORT <= $NUMBER_OF_PORTS; PORT++)); do
            STATOUT=`$IBSTAT $DEVNAME $PORT && echo -n "type=ibport;devname=$DEVNAME;port=$PORT;"`
            #check if this ib , if not - continue
            echo "$STATOUT" |  grep -i Eth > /dev/null
            if [ $? == 0 ]; then
                continue
            fi

            cat /sys/class/infiniband/$DEVNAME/ports/$PORT/link_layer 2> /dev/null | grep Ethernet > /dev/null
            if [ $? == 0 ]; then
                continue
            fi

            LID=`gettoken "lid" ":" "$STATOUT"`
            LIDMASK=`gettoken "LMC" ":" "$STATOUT"`

            echo $STATOUT | grep -i Disable > /dev/null 2>&1 
            if [ $? == 0 ]; then DISABLE=true; else DISABLE=false; fi

            echo $STATOUT | grep -i Active > /dev/null 2>&1 
            if [ $? == 0 ]; then ACTIVE=true; else ACTIVE=false; fi

            GUID=`gettoken "Port GUID" ":" "$STATOUT"`
            SMPOUT=`$SMPQUERY portinfo -D $GUID`
            DIAGCODE=`gettoken "DiagCode" ":" "$SMPOUT"`
            RATE=`gettoken "Rate" ":" "$STATOUT"`
	    PHYSICAL_STATE=`gettoken "Physical state" ":" "$STATOUT"`

            #Adding exec of ibportstate command
            if [ "X$SMPQUERY" = "Xnop" ];then
                WIDTH=0
                ENABLED_SPEED=0
            else
                STATOUT=`$SMPQUERY -C $DEVNAME  PI -D 0 $PORT && echo -n "type=ibport;devname=$DEVNAME;port=$PORT;"`

                WIDTH=`gettoken "LinkWidthActive" ":" "$STATOUT"`

                WIDTH=`getWidth $WIDTH`

                ENABLED_SPEED=`getExtendedEnabledSpeed "$STATOUT"`;

                if [ $ENABLED_SPEED == 0 ]; then
                    ENABLED_SPEED=0;
                else
                    ENABLED_SPEED=`getEnabledSpeed "$STATOUT"`;
                fi
            fi

            #echo "disable=$DISABLE;active=$ACTIVE;guid=$GUID;rate=$RATE;width=$WIDTH;enabled_speed=$ENABLED_SPEED; type=ibport;name=$DEVNAME;port=$PORT;lid=$LID;lidmask=$LIDMASK" > /tmp/dima_test.txt	
            echo -n "type=ibport;name=$DEVNAME;port=$PORT;lid=$LID;lidmask=$LIDMASK;"
            echo    "disable=$DISABLE;active=$ACTIVE;guid=$GUID;rate=$RATE;width=$WIDTH;enabled_speed=$ENABLED_SPEED;physical_state=$PHYSICAL_STATE;diag_code=$DIAGCODE"
        done

    done
else
    for DEVPATH in /sys/class/infiniband/*
    do
        DEVNAME=${DEVPATH##*/}
        for PORTPATH in $DEVPATH/ports/*
        do
            PORT=${PORTPATH##*/}
            LINK_LAYER=`cat $PORTPATH/link_layer`
            if [ $LINK_LAYER == "Ethernet" ]; then
                continue
            fi

            LID=`cat $PORTPATH/lid`
            LIDMASK=`cat $PORTPATH/lid_mask_count`
            PHYS_STATE=`cat $PORTPATH/phys_state | awk '{print $2}'`
            if [ $PHYS_STATE == "Disabled" ]; then DISABLE=true; else DISABLE=false; fi
            STATE=`cat $PORTPATH/state | awk '{print $2}'`
            if [ $STATE == "ACTIVE" ]; then ACTIVE=true; else ACTIVE=false; fi
            GUID="0x`cat $PORTPATH/gids/0 | awk -F':' '{print $5$6$7$8}'`"

            RATEOUT=`cat $PORTPATH/rate`
            RATE=`echo $RATEOUT | awk '{print $1}'`
            WIDTH=`echo $RATEOUT| awk '{print $3}' | $SED -e 's/(\([0-9]*\)X/\1/'`
            ENABLED_SPEED=`getExtendedEnabledSpeed "$RATEOUT"`;

            echo -n "type=ibport;name=$DEVNAME;port=$PORT;lid=$LID;lidmask=$LIDMASK;"
            echo    "disable=$DISABLE;active=$ACTIVE;guid=$GUID;rate=$RATE;width=$WIDTH;enabled_speed=$ENABLED_SPEED"
        done
    done
fi
}

getPortStatus()
{
	STATOUT=`$IBSTAT $DEVNAME`
	echo $STATOUT | grep -i Active > /dev/null 2>&1 
	if [ $? == 0 ]; then ACTIVE=true; else ACTIVE=false; fi

}

getDeviceSerialNumber()
{
	STATOUT=`$LSPCI -vvv`
	SERIAL_NUMBER=`gettoken "Serial number" ":" "$STATOUT"`
	echo -n $SERIAL_NUMBER
	
}
getDeviceModel()
{
	STATOUT=`$LSPCI -vvv`
	MODEL=`gettoken "Network controller" ":" "$STATOUT"`
	echo -n $MODEL

}
getNodeGUID()
{
	STATOUT=`$IBSTAT`
	NODEGUID=`gettoken "Node GUID" ":" "$STATOUT"`
	echo -n $NODEGUID

}
runibdiag() {
if [ "X${LIGHT}" != "Xyes" ]; then
    pkill -9 ib_write_bw > /dev/null 2>&1 
    ( ib_send_bw -e -i $2 -d $1 -n $3 > /tmp/runibdiag.d.$$ 2>&1 ) &
    ( ib_send_bw -e -i $2 -d $1 -n $3 localhost > /tmp/runibdiag.c.$$ 2>&1 )
    if [ $? = 0 ]; then echo $$:PASSED; else echo $$:FAILED; fi
else
    echo $$:PASSED
fi
}

getmacaddress() {
    cat /sys/class/net/$1/address 2> /dev/null || echo 0
}

getcurrentmtu() {
    cat /sys/class/net/$1/mtu 2> /dev/null || echo 0 
}

getcounter() {
    SYSFSSTATISTICS="/sys/class/net/$1/statistics"
    cat $SYSFSSTATISTICS/$2 2> /dev/null || echo 0
}

getstatistics() {
    RECPACK=`getcounter $1 rx_packets`
    RECERR=`getcounter $1 rx_errors`
    RECDROP=`getcounter $1 rx_dropped`
    RECOVERERR=`getcounter $1 rx_over_errors`
    RECFRAMWERR=`getcounter $1 rx_frame_errors`
    SENDPACK=`getcounter $1 tx_packets`
    TRANSERR=`getcounter $1 tx_errors`
    TRANSDROP=`getcounter $1 tx_dropped`
    TRANSCARERR=`getcounter $1 tx_carrier_errors`
    COLLISIONS=`getcounter $1 collisions`
    RECBYTE=`getcounter $1 rx_bytes`
    TRANSBYTE=`getcounter $1 tx_bytes`
    RECCRCERR=`getcounter $1 rx_crc_errors`
    echo $RECPACK:$RECERR:$RECDROP:$RECOVERERR:$RECFRAMWERR:$SENDPACK:$TRANSERR:$TRANSDROP:$TRANSCARERR:$COLLISIONS:$RECBYTE:$TRANSBYTE:$RECCRCERR
}

getIBPortstatistics(){
	COUNTER=1; 
	for DEVNAME in  `$IBSTAT -l`; do
       		#for all devices (mlx4_X)
       		 STATOUT=`$IBSTAT $DEVNAME`
       		 STATOUTT=`$IBSTAT`
       		 NUMBER_OF_PORTS=`gettoken "Number of ports" ":" "$STATOUT"`
  		      for ((PORT = 1; PORT <= $NUMBER_OF_PORTS; PORT++)); do
            		       	#GUID=`gettoken "Port GUID" ":" "$STATOUT"`
			      	GUID=`$IBSTAT -p | sed -n ${COUNTER}p`
				COUNTER=$((COUNTER+1))
				EBOE=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/excessive_buffer_overrun_errors`
				PRSRE=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/port_rcv_switch_relay_errors`
				LD=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/link_downed`
				LLIE=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/local_link_integrity_errors`
				PXD=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/port_xmit_discards`
				PRCE=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/port_rcv_constraint_errors`
				PRE=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/port_rcv_errors`
				VL15=`cat /sys/class/infiniband/$DEVNAME/subsystem/$DEVNAME/ports/$PORT/counters/VL15_dropped`
		      		echo $GUID:$EBOE:$PRSRE:$LD:$LLIE:$PXD:$PRCE:$PRE:$VL15:$DEVNAME:$PORT
				
		      done
	done
 
}

listIBLocation(){

	DEVLS=`$LSPCI -n -d $VENDID: | sed -ne 's/\([0-9]*.*\.0\).*/\1/p'`
	for DEV in $DEVLS
    	do
	
		STATOUT=`$LSPCI -vvv`
		PHYSICAL_SLOT=`gettoken "Physical Slot" ":" "$STATOUT"`
		PHYSICAL_SLOT_HEX=`printf '%x\n' $PHYSICAL_SLOT`
		SLOT=`printf '%d\n' ${PHYSICAL_SLOT_HEX:1:2}`
		BLADE=`printf '%d\n' ${PHYSICAL_SLOT_HEX:3:1}`
		ENCLOSURE=`printf '%d\n' ${PHYSICAL_SLOT_HEX:4:1}`
		CABINET=`printf '%d\n' ${PHYSICAL_SLOT_HEX:0:1}`
		LAST2=`printf '%d\n' ${PHYSICAL_SLOT_HEX:5:2}`
		TIME=`date -d "$GTIME"  '+%Y%m%d%H%M%S.000000%z' | sed -e 's/0\(...\)$/\1/'`
		SN=$(getDeviceSerialNumber)
		ADDRESS=`cat /sys/bus/pci/slots/$PHYSICAL_SLOT/address | sed -e 's/\:/\\\:/g'`
	
	
		for PCIBRIDGEPATH in /sys/bus/pci/devices/*/$ADDRESS
		do
			if [ -d "$PCIBRIDGEPATH" ]; then
				PCIBRIDGE=${PCIBRIDGEPATH##*/}
			fi
		done
		ROOT_COMPLEX=$BLADE
		PL=0$ENCLOSURE-00-0$BLADE-0$ROOTCOMPLEX-0$CABINET-0$SLOT-FF-$LAST2

		echo "slot=$SLOT;blade=$BLADE;enclosure=$ENCLOSURE;cabinet=$CABINET;serial_number=$SN;physical_location=$PL;datetime=$TIME"
	done
}

loadmodule() {
    if ! ( $LSMOD | grep -w $1 > /dev/null 2>&1 ); then
        $MODPROBE $1 > /dev/null 2>&1
    fi
}

if [[ `getmodver mlx4_core` == "NA" ]]; then
    $DEPMOD > /dev/null 2>&1
fi

if [[ "$LSMOD" != "nop" && "$MODPROBE" != "nop" ]] ; then
    loadmodule mlx4_core
    loadmodule mlx4_ib
    loadmodule mlx4_en
    loadmodule ib_ipoib
fi

case "$1" in
    swls)
        listsoftware | uniq;

        ;;

    fwls)
        listfirmware | uniq;

        ;;
    ibls)
        listibports | uniq;
        ;;
    ibdiag)
        runibdiag $2 $3 10000;
        ;;
    getmac)
        getmacaddress $2;
        ;;

    getmtu)
        getcurrentmtu $2;
        ;;
	
    getstat)
        getstatistics $2;
        ;;
    getibstat)
	getIBPortstatistics $2;
	;;
    pkgls)
	listpkg $2;
	;;
    getlocation)
	listIBLocation $2;
	;;
    *)
        echo Unknown command $1
        ;;

esac
