#!/bin/bash
#========================================
# Common functions
#========================================
intf_resetAll()
{
	sed -i '/CONFIG_USB_HCI = /c\CONFIG_USB_HCI = n' Makefile
	sed -i '/CONFIG_PCI_HCI = /c\CONFIG_PCI_HCI = n' Makefile
	sed -i '/CONFIG_SDIO_HCI = /c\CONFIG_SDIO_HCI = n' Makefile
	sed -i '/CONFIG_GSPI_HCI = /c\CONFIG_GSPI_HCI = n' Makefile
}
intf_usb()
{
	intf_resetAll
	sed -i '/CONFIG_USB_HCI = /c\CONFIG_USB_HCI = y' Makefile
}
intf_pcie()
{
	intf_resetAll
	sed -i '/CONFIG_PCI_HCI = /c\CONFIG_PCI_HCI = y' Makefile
}
intf_sdio()
{
	intf_resetAll
	sed -i '/CONFIG_SDIO_HCI = /c\CONFIG_SDIO_HCI = y' Makefile
}
intf_gspi()
{
	intf_resetAll
	sed -i '/CONFIG_GSPI_HCI = /c\CONFIG_GSPI_HCI = y' Makefile
}

nic_resetAll()
{
	sed -i '/CONFIG_RTL8852A = /c\CONFIG_RTL8852A = n' Makefile
	sed -i '/CONFIG_RTL8852B = /c\CONFIG_RTL8852B = n' Makefile
	sed -i '/CONFIG_RTL8852BP = /c\CONFIG_RTL8852BP = n' Makefile
	sed -i '/CONFIG_MP_INCLUDED = /c\CONFIG_MP_INCLUDED = n' Makefile
	sed -i '/CONFIG_POWER_SAVING = /c\CONFIG_POWER_SAVING = n' Makefile
	sed -i '/CONFIG_BT_COEXIST = / c\CONFIG_BT_COEXIST = n' Makefile
	sed -i '/CONFIG_EMBRYO_DRV = /c\CONFIG_EMBRYO_DRV = n' Makefile
}

nic_8852a(){
	nic_resetAll
	sed -i '/CONFIG_RTL8852A = /c\CONFIG_RTL8852A = y' Makefile
	#sed -i '/CONFIG_BT_COEXIST = / c\CONFIG_BT_COEXIST = n' Makefile
	sed -i '/CONFIG_MP_INCLUDED = /c\CONFIG_MP_INCLUDED = n' Makefile
	sed -i '/USE_TRUE_PHY = /c\USE_TRUE_PHY = y' Makefile
	#sed -i '/CONFIG_POWER_SAVING = /c\CONFIG_POWER_SAVING = y' Makefile
	#sed -i '/CONFIG_EMBRYO_DRV = /c\CONFIG_EMBRYO_DRV = y' Makefile
	#config_halmac_files 8852A
}

ch_obj_8852ae()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852AE) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852AE = m' Makefile
}

ch_obj_8852au()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852AU) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852AU = m' Makefile
}

ch_obj_8852as()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852AS) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852AS = m' Makefile
}

nic_8852b(){
	nic_resetAll
	sed -i '/CONFIG_RTL8852B = /c\CONFIG_RTL8852B = y' Makefile
	#sed -i '/CONFIG_BT_COEXIST = / c\CONFIG_BT_COEXIST = n' Makefile
	sed -i '/CONFIG_MP_INCLUDED = /c\CONFIG_MP_INCLUDED = n' Makefile
	sed -i '/USE_TRUE_PHY = /c\USE_TRUE_PHY = y' Makefile
	#sed -i '/CONFIG_POWER_SAVING = /c\CONFIG_POWER_SAVING = y' Makefile
	#sed -i '/CONFIG_EMBRYO_DRV = /c\CONFIG_EMBRYO_DRV = y' Makefile
	#config_halmac_files 8852B
}

ch_obj_8852be()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852BE) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852BE = m' Makefile
}

ch_obj_8852bu()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852BU) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852BU = m' Makefile
}

ch_obj_8852bs()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852BS) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852BS = m' Makefile
}

nic_8852bp(){
	nic_resetAll
	sed -i '/CONFIG_RTL8852BP = /c\CONFIG_RTL8852BP = y' Makefile
	#sed -i '/CONFIG_BT_COEXIST = / c\CONFIG_BT_COEXIST = n' Makefile
	sed -i '/CONFIG_MP_INCLUDED = /c\CONFIG_MP_INCLUDED = n' Makefile
	sed -i '/USE_TRUE_PHY = /c\USE_TRUE_PHY = y' Makefile
	#sed -i '/CONFIG_POWER_SAVING = /c\CONFIG_POWER_SAVING = y' Makefile
	#sed -i '/CONFIG_EMBRYO_DRV = /c\CONFIG_EMBRYO_DRV = y' Makefile
	#config_halmac_files 8852BP
}

ch_obj_8852bpe()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852BPE) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852BPE = m' Makefile
}

ch_obj_8852bpu()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852BPU) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852BPU = m' Makefile
}

ch_obj_8852bps()
{
	sed -i '/obj-$(CONFIG_RTL/c\obj-$(CONFIG_RTL8852BPS) := $(MODULE_NAME).o' Makefile
	sed -i '/export CONFIG_RTL/c\export CONFIG_RTL8852BPS = m' Makefile
}

#========================================
# Sub functions
#========================================
config_halmac_files()
{
	local hw_cfg_file="hal/halmac/halmac_hw_cfg.h"
	local hw_cfg_temp_file="hal/halmac/halmac_hw_cfg_temp.h"

	if [ -z "$1" ]; then
		# Error! No input
		return
	fi

	if [ -f "$hw_cfg_file" ]; then
		local preconfig=`grep '#include[ \t]\+<drv_conf\.h>' $hw_cfg_file`

		if [ -n "$preconfig" ]; then
			# Don't edit file contains "#include <drv_conf.h>"
			echo "$hw_cfg_file already existed and no need to config."
			return
		fi

		echo "Move original $hw_cfg_file to $hw_cfg_file.bak"
		mv $hw_cfg_file $hw_cfg_file.bak
	fi

	# There is no $hw_cfg_file here!
	echo "Copy $hw_cfg_temp_file to $hw_cfg_file, and config to $1"
	cp $hw_cfg_temp_file $hw_cfg_file

	# clear HALMAC support IC define, someone should define needed IC later
	sed -i 's/\(#define HALMAC_\w\+_SUPPORT\)\s\+1\s*/\1\t0/' $hw_cfg_file

	# Enable support IC
	for IC in $@; do
		sed -i 's/\(#define HALMAC_'$IC'_SUPPORT\)\s\+0\s*/\1\t1/' $hw_cfg_file
	done
}

LogFile=make_log
function LOG()
{
	echo -e $1 | tee -a -i $LogFile;
}

KO_FOLDER=rtk_wifi_ko
config_make_ko_folder()
{
	rm -rf $KO_FOLDER
	mkdir -p $KO_FOLDER
	chmod -R 777 $KO_FOLDER
}
config_cp_ko()
{
	cp *.ko $KO_FOLDER/.
}

config_make()
{
	make clean;
	# 1:stdout,2:stderr
	# Redirecting the stderr to file
	#make -j2 2> $LogFile;
	# Redirecting the stderr and stdout to file
	#make -j2 > $LogFile 2>&1;
	#make -j2 &>> $LogFile

	if [ $SMATCH_CHECK = 1 ]; then
		#echo "compiling.... & smatch checking...."
		#make CHECK="smatch $SMATCH_OPT" CC="cgcc" -j2 2>&1 | grep "warn:\|error:" | tee -a -i $LogFile;
		#make CHECK="smatch $SMATCH_OPT" CC="cgcc" -j2 2>&1 | grep "warn:\|error:"
		make CHECK="smatch $SMATCH_OPT" CC="cgcc" -j2 2>&1 | tee -a -i $LogFile;
		cat $LogFile | grep "warn:\|error:" | cut -c$((${#PWD}+2))- > smatch_log
	else
		make -j2 2>&1 | tee -a -i $LogFile;
	fi

	config_cp_ko;
}


make_8852ae()
{
	nic_8852a;
	intf_pcie;
	ch_obj_8852ae;
	config_make;
	LOG ".......... compile 8852ae done ..........";
	LOG "==================================================";
}

make_8852au()
{
	nic_8852a;
	intf_usb;
	ch_obj_8852au;
	config_make;
	LOG ".......... compile 8852au done ..........";
	LOG "==================================================";
}

make_8852as()
{
	nic_8852a;
	intf_sdio;
	ch_obj_8852as;
	config_make;
	LOG ".......... compile 8852as done ..........";
	LOG "==================================================";
}

make_8852be()
{
	nic_8852b;
	intf_pcie;
	ch_obj_8852be;
	config_make;
	LOG ".......... compile 8852be done ..........";
	LOG "==================================================";
}

make_8852bu()
{
	nic_8852b;
	intf_usb;
	ch_obj_8852bu;
	config_make;
	LOG ".......... compile 8852bu done ..........";
	LOG "==================================================";
}

make_8852bs()
{
	nic_8852b;
	intf_sdio;
	ch_obj_8852bs;
	config_make;
	LOG ".......... compile 8852bs done ..........";
	LOG "==================================================";
}

make_8852bpe()
{
	nic_8852bp;
	intf_pcie;
	ch_obj_8852bpe;
	config_make;
	LOG ".......... compile 8852bpe done ..........";
	LOG "==================================================";
}

make_8852bpu()
{
	nic_8852bp;
	intf_usb;
	ch_obj_8852bpu;
	config_make;
	LOG ".......... compile 8852bpu done ..........";
	LOG "==================================================";
}

make_8852bps()
{
	nic_8852bp;
	intf_sdio;
	ch_obj_8852bps;
	config_make;
	LOG ".......... compile 8852bps done ..........";
	LOG "==================================================";
}

make_all()
{
	make_8852ae;
	make_8852au;
	make_8852as;
	make_8852be;
	make_8852bu;
	make_8852bs;
	make_8852bpe;
	make_8852bpu;
	make_8852bps;
}

make_sdio()
{
	make_8852as;
	make_8852bs;
	make_8852bps;
}

make_pcie()
{
	make_8852ae;
	make_8852be;
	make_8852bpe;
}
make_usb()
{
	make_8852au;
	make_8852bu;
	make_8852bpu;
}
#========================================
# Main Script Start From Here
#========================================
# set variables
MAKEFILE="Makefile"

# Chip options
declare -a chipsOption
chipsOption=()
chipsOption+=(RTL8852ae RTL8852au RTL8852as)
chipsOption+=(RTL8852be RTL8852bu RTL8852bs)
chipsOption+=(RTL8852bpe RTL8852bpu RTL8852bps)
chipsOption+=(USB SDIO PCIE)
chipsOption+=(ALL)

if [ $# -eq 1 ]; then
	card=$1
	echo "You have selected $card"
else
	# Select NIC type
	echo "Please select card type(1-${#chipsOption[*]}):"
	select card in "${chipsOption[@]}";
	do
		echo "You have selected $card"
		break
	done
fi

# syntax checker - Smatch / checkpatch.pl
declare -a syntaxChecker
syntaxChecker=()
syntaxChecker+=(None Smatch)


SMATCH_CHECK=0
# Make Other selection
if [ "$card" != "ALL" ];then
if [ "$card" != "USB" ];then
if [ "$card" != "SDIO" ];then
if [ "$card" != "PCIE" ];then
if [ $# -eq 1 ]; then
	checker="None"
	echo "You have selected syntax checker $checker"
else
        # Select checker
	echo "=================================="
        echo "Please select syntax checker:(1-${#syntaxChecker[*]}):"
        select checker in "${syntaxChecker[@]}";
        do
        	echo "You have selected $checker"

          if [ "$checker" = "Smatch" ]; then
          	SMATCH_CHECK=1
          fi
          break
        done
fi
fi
fi
fi
fi

rm $LogFile
config_make_ko_folder;
cp Makefile_ko Makefile

# Make
case "$card" in
	[Rr][Tt][Ll]8852[Aa][Ee])
	make_8852ae;;
	[Rr][Tt][Ll]8852[Aa][Uu])
	make_8852au;;
	[Rr][Tt][Ll]8852[Aa][Ss])
	make_8852as;;
	[Rr][Tt][Ll]8852[Bb][Ee])
	make_8852be;;
	[Rr][Tt][Ll]8852[Bb][Uu])
	make_8852bu;;
	[Rr][Tt][Ll]8852[Bb][Ss])
	make_8852bs;;
	[Rr][Tt][Ll]8852[Bb][Pp][Ee])
	make_8852bpe;;
	[Rr][Tt][Ll]8852[Bb][Pp][Uu])
	make_8852bpu;;
	[Rr][Tt][Ll]8852[Bb][Pp][Ss])
	make_8852bps;;
	[Ss][Dd][Ii][Oo])
	make_sdio;;
	[Pp][Cc][Ii][Ee])
	make_pcie;;
	[Uu][Ss][Bb])
	make_usb;;
	[Aa][Ll][Ll])
	make_all;;
	*)
	echo "Unknown NIC type"
	;;
esac
