#!/bin/bash

# This adapter config script is for the Chelsio T580 card to switch between 2x40G, 4x10G and QSA
#
#cat /usr/share/hwdata/pci.ids | grep T580- | grep 541
#        5410  T580-LP-CR Unified Wire Ethernet Controller
#        540d  T580-CR Unified Wire Ethernet Controller
#        5414  T580-LP-SO-CR Unified Wire Ethernet Controller

echo
vpd_dir=/lib/firmware/cxgb4
bin_dir=/sbin

REBOOT=0

T580_LP_CR=`lspci -d 1425:5410 | wc -l`
T580_CR=`lspci -d 1425:540d | wc -l`
T580_LP_SO_CR=`lspci -d 1425:5414 | wc -l`

if [ $T580_LP_CR -gt 0 ] || [ $T580_CR -gt 0 ] || [ $T580_LP_SO_CR -gt 0 ]; then
	echo Chelsio T580 card detected
else
	echo Chelsio T580 card not detected
	exit 1
fi

#############################################################
# List Chelsio T580 devices                                 #
#############################################################
i=0
echo; 
echo "Chelsio T580 PCI devices :"
echo "|------------------------------|"
for pci_dev in /sys/bus/pci/devices/*/
do
	device=`cat $pci_dev/device 2> /dev/null`

	if [ "$device" == 0x5410 ]; then
		i=`echo "$i + 1" | bc`
		Devices[$i]=$pci_dev
		dev=`echo $pci_dev | cut -d '/' -f 6|cut -c 6-|cut -c -6`
		dev=$dev"0"
		echo "| $i T580-LP-CR    $dev      |"
	elif [ "$device" == 0x540d ]; then
		i=`echo "$i + 1" | bc`
		Devices[$i]=$pci_dev
		dev=`echo $pci_dev | cut -d '/' -f 6|cut -c 6-|cut -c -6`
		dev=$dev"0"
		echo "| $i T580-CR       $dev      |"
	elif [ "$device" == 0x5414 ]; then
		i=`echo "$i + 1" | bc`
		Devices[$i]=$pci_dev
		dev=`echo $pci_dev | cut -d '/' -f 6|cut -c 6-|cut -c -6`
		dev=$dev"0"
		echo "| $i T580-LP-SO-CR $dev      |"
	fi
done
echo "|------------------------------|"; echo

#############################################################
# Select device to modify                                   #
#############################################################
dev_in=1
if [ $i -ne 1 ]; then
	echo -n "Please select device to modify [$dev_in]: "
	read dev_in
	echo
	if [ -z $dev_in ]; then dev_in=1; fi

	printf "%s\n" $dev_in |grep -E "^[+-]?[0-9]+$" > /dev/null
	if [ "$?" == 0 ]; then
		if [ $dev_in -lt 1 ]; then
			echo "Illegal index selected, quitting..."; echo
			exit 1;
		fi

		device=`cat ${Devices[$dev_in]}/device 2> /dev/null`
        	if [ "$device" == 0x5410 ]; then
                	dev=`echo ${Devices[$dev_in]} | cut -d '/' -f 6|cut -c 6-`
        	elif [ "$device" == 0x540d ]; then
                	dev=`echo ${Devices[$dev_in]} | cut -d '/' -f 6|cut -c 6-`
        	elif [ "$device" == 0x5414 ]; then
                	dev=`echo ${Devices[$dev_in]} | cut -d '/' -f 6|cut -c 6-`
		else
			echo "Illegal value selected, quitting..."; echo
			exit 1
		fi
	else
		echo "Numeric value expected, quitting..."; echo
		exit 1
	fi
else
    device=`cat ${Devices[$dev_in]}/device 2> /dev/null`
    dev=`echo ${Devices[$dev_in]} | cut -d '/' -f 6|cut -c 6-`
fi

echo "Possible T580 adapter modes: "
echo "|------------------------------|"
echo "| 1: 2x40G                     |"
echo "| 2: 4x10G                     |"
echo "| 3: QSA                       |"
echo "|------------------------------|"
echo
echo -n "Select mode for adapter (1,2,3): "
read mode
echo

	
dev=`echo $dev|cut -c -6`
dev=$dev"0"
if [ "$mode" == 1 ]; then 
	echo Programming mode 1: 2x40G 
	echo
	#echo $dev
	if [ "$device" == 0x5410 ]; then #T580-LP-CR 2x40G
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_cr_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_cr_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_cr_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_cr_variable_2133_vpd.bin
	elif [ "$device" == 0x540d ]; then #T580-CR 2x40G
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_cr_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_cr_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_cr_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_cr_variable_2133_vpd.bin
	elif [ "$device" == 0x5414 ]; then #T580-LP-SO-CR 2x40G
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_so_variable_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_so_variable_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_so_variable_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_so_variable_vpd.bin
	fi
	echo
	echo Please unload and reload the Chelsio driver for the changes to take effect
elif [ "$mode" == 2 ]; then 
	echo Programming mode 2: 4x10G 
	echo
	if [ "$device" == 0x5410 ]; then #T580-LP-CR 4x10G
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_cr_spider_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_cr_spider_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_cr_spider_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_cr_spider_variable_2133_vpd.bin
	elif [ "$device" == 0x540d ]; then #T580-CR 4x10G
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_cr_spider_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_cr_spider_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_cr_spider_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_cr_spider_variable_2133_vpd.bin
	elif [ "$device" == 0x5414 ]; then #T580-LP-SO-CR 4x10G
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_so_spider_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_so_spider_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_so_spider_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_so_spider_variable_2133_vpd.bin
		REBOOT=1
	fi
	echo
	if [ ${REBOOT} == 1 ] ; then
		echo "Please reboot the machine for the changes to take effect"
	else
		echo Please unload and reload the Chelsio driver for the changes to take effect
	fi

elif [ "$mode" == 3 ]; then 
	echo Programming mode 3: QSA
	echo
	if [ "$device" == 0x5410 ]; then #T580-LP-CR QSA 
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_cr_qsa_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_cr_qsa_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_cr_qsa_variable_2133_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_cr_qsa_variable_2133_vpd.bin
	elif [ "$device" == 0x540d ]; then #T580-CR QSA 
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_cr_qsa_variable_2133_vpd.bin
 		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_cr_qsa_variable_2133_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_cr_qsa_variable_2133_vpd.bin
 		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_cr_qsa_variable_2133_vpd.bin
	elif [ "$device" == 0x5414 ]; then #T580-LP-SO-CR QSA 
		echo $bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_so_qsa_variable_vpd.bin
		$bin_dir/t5seeprom -b $dev write -fvpd:$vpd_dir/t580_lp_so_qsa_variable_vpd.bin
		echo $bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_so_qsa_variable_vpd.bin
		$bin_dir/t5seeprom -b $dev verify -fvpd:$vpd_dir/t580_lp_so_qsa_variable_vpd.bin
		REBOOT=1
	fi
	echo
	if [ ${REBOOT} == 1 ] ; then
		echo "Please reboot the machine for the changes to take effect"
	else
		echo Please unload and reload the Chelsio driver for the changes to take effect
	fi
else
	echo Programming mode 1: 2x40G or mode 2: 4x10G or mode 3: QSA  not selected; 
fi

echo
