#!/bin/sh

OPTIMIZED_FOR="$1"
CPU_LIST=`cat /proc/interrupts | sed -n '1p'`
NUM_OF_CPU=0; for i in $CPU_LIST; do NUM_OF_CPU=`expr $NUM_OF_CPU + 1`; done;
DEFAULT_RPS=0

. /lib/functions.sh

RPS_IF_LIST=""
NUM_WIFI_CARD=0
WIFI_RADIO1=0
WIFI_RADIO2=0
WIFI_RADIO3=0
WED_ENABLE=0

WIFI_MODULE_LIST='mt7915e mt7996e'

get_if_info()
{
	# try to get all wifi and eth net interface.
	dbg2 "try to get all wifi and eth net interface."
	NET_IF_LIST=`ls /sys/class/net`
	for vif in $NET_IF_LIST;
	do
		if [[ "$vif" == "eth"* ]] ||  \
		[[ "$vif" == "lan"* ]] || [[ "$vif" == "wan"* ]] || \
		[[ "$vif" == "wlan"* ]] || [[ "$vif" == "phy"* ]]; then
			RPS_IF_LIST="$RPS_IF_LIST $vif"
		fi
	done;
	dbg2 "RPS_IF_LIST = $RPS_IF_LIST"

	# try to get wifi physical card num.
	dbg2 "try to get wifi physical card num."
	VIRTUAL_RADIO_LIST=`ls -l /sys/class/ieee80211/ | awk -F 'devices' '{print $2}' | awk -F 'phy' '{print $1}' | uniq`
	for v in $VIRTUAL_RADIO_LIST;
	do
		NUM_WIFI_CARD=`expr $NUM_WIFI_CARD + 1`
		dbg2 "physical raido $v"
		if [[ $v == *"wmac"* ]]; then
			WIFI_RADIO1=1
		fi

		if [[ $v == *"wbsys"* ]]; then
			WIFI_RADIO1=1
		fi

		if [[ $v == *"pci0000"* ]]; then
			WIFI_RADIO2=1
		fi

		if [[ $v == *"pci0001"* ]]; then
			WIFI_RADIO3=1
		fi
	done;


	for v in $WIFI_MODULE_LIST;
	do
		if [[ -f "/sys/module/$v/parameters/wed_enable" ]]; then
			WED_ENABLE_LIST=`cat /sys/module/$v/parameters/wed_enable`
			dbg2 "wed enable ori info $v $WED_ENABLE_LIST"
			if [[ $WED_ENABLE_LIST == "Y" ]]; then
				WED_ENABLE=1
			fi
		fi
	done;
	dbg2 "NUM_WIFI_CARD = $NUM_WIFI_CARD"
	dbg2 "platform wifi enable = $WIFI_RADIO1"
	dbg2 "pcie1 wifi enable = $WIFI_RADIO2"
	dbg2 "pcie2 wifi enable = $WIFI_RADIO3"
	dbg2 "WED enable = $WED_ENABLE"
}

# $1: CPU#
# $2: irq list for added.
CPU_AFFINITY_ADD()
{
	eval oval=\$CPU${1}_AFFINITY
	eval CPU${1}_AFFINITY=\"\$CPU${1}_AFFINITY $2\"
}

# $1: CPU#
# $2: Interface name for added.
CPU_RPS_ADD()
{
	eval oval=\$CPU${1}_RPS
	eval CPU${1}_RPS=\"\$CPU${1}_RPS $2\"
	dbg2 "CPU${1}_RPS=\"\$CPU${1}_RPS $2\""
}

MT7988()
{
	num_of_wifi=$1
	DEFAULT_RPS=0

	#Physical IRQ# setting
	#Ethernet RSS feature enables 4 Rx rings
	eth_irq_rx0=221
	eth_irq_rx1=222
	eth_irq_rx2=223
	eth_irq_rx3=224
	eth_irq_tx=229
	wifi1_irq_pcie0=524288
	wifi1_irq_pcie1=134742016
	wifi2_irq_pcie0=
	wifi2_irq_pcie1=

	if [[ "$WED_ENABLE" -eq "1" ]]; then
		dbg2 "WED_ENABLE ON irq/iptable setting"
		#TCP Binding
		iptables -D FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		iptables -I FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		ip6tables -D FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		ip6tables -I FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		#UDP Binding
		iptables -D FORWARD -p udp -j FLOWOFFLOAD --hw
		iptables -I FORWARD -p udp -j FLOWOFFLOAD --hw
		ip6tables -D FORWARD -p udp -j FLOWOFFLOAD --hw
		ip6tables -I FORWARD -p udp -j FLOWOFFLOAD --hw

	else
		dbg2 "WED_ENABLE OFF irq/iptable seting"
	fi

	for vif in $NET_IF_LIST;
	do
		if [[ "$vif" == "wlan"* ]] || [[ "$vif" == "phy"* ]]; then
			WIFI_IF_LIST="$WIFI_IF_LIST $vif"
		fi
	done;
	dbg2 "$WIFI_IF_LIST = $WIFI_IF_LIST"
	# Please update the CPU binding in each cases.
	# CPU#_AFFINITY="add binding irq number here"
	# CPU#_RPS="add binding interface name here"
	if [ "$num_of_wifi" = "0" ]; then
		CPU0_AFFINITY="$eth_irq_rx0 $eth_irq_tx"
		CPU1_AFFINITY="$eth_irq_rx1"
		CPU2_AFFINITY="$eth_irq_rx2"
		CPU3_AFFINITY="$eth_irq_rx3"

		CPU0_RPS="$RPS_IF_LIST"
		CPU1_RPS="$RPS_IF_LIST"
		CPU2_RPS="$RPS_IF_LIST"
		CPU3_RPS="$RPS_IF_LIST"
	else
		#we bound all wifi card to cpu0 and bound eth to cpu
		CPU0_AFFINITY=""
		CPU1_AFFINITY=""
		CPU2_AFFINITY="$eth_irq_rx0 $eth_irq_rx1 $eth_irq_tx"
		CPU3_AFFINITY="$eth_irq_rx2 $eth_irq_rx3"

		CPU0_RPS="$WIFI_IF_LIST"
		CPU1_RPS="$WIFI_IF_LIST"
		CPU2_RPS=""
		CPU3_RPS=""
	fi
	dbg2 "CPU0_AFFINITY = $CPU0_AFFINITY"
	dbg2 "CPU1_AFFINITY = $CPU1_AFFINITY"
	dbg2 "CPU2_AFFINITY = $CPU2_AFFINITY"
	dbg2 "CPU3_AFFINITY = $CPU3_AFFINITY"
}

MT7986()
{
	num_of_wifi=$1
	DEFAULT_RPS=0

	#Physical IRQ# setting
	#Ethernet RSS feature enables 4 Rx rings
	eth_irq_rx0=221
	eth_irq_rx1=222
	eth_irq_rx2=223
	eth_irq_rx3=224
	eth_irq_tx=229
	wifi1_irq=
	wifi2_irq=
	wifi3_irq=

	if [[ "$WED_ENABLE" -eq "1" ]]; then
		dbg2 "WED_ENABLE ON irq/iptable setting"
		#TCP Binding
		iptables -D FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		iptables -I FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		ip6tables -D FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		ip6tables -I FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j FLOWOFFLOAD --hw
		#UDP Binding
		iptables -D FORWARD -p udp -j FLOWOFFLOAD --hw
		iptables -I FORWARD -p udp -j FLOWOFFLOAD --hw
		ip6tables -D FORWARD -p udp -j FLOWOFFLOAD --hw
		ip6tables -I FORWARD -p udp -j FLOWOFFLOAD --hw

		#AX6000 AX7800 - SOC
		if [[ "$WIFI_RADIO1" -eq "1" ]]; then
			wifi1_irq=238
		fi
		#AX7800 - PCIE0
		if [[ "$WIFI_RADIO2" -eq "1" ]]; then
			wifi2_irq=237
		fi
		#AX7800 - PCIE1
		#if [[ "$WIFI_RADIO3" -eq "1" ]]; then
		#	wifi3_irq=239
		#fi
	else
		dbg2 "WED_ENABLE OFF irq/iptable seting"
		#AX6000 AX7800 - SOC
		if [[ "$WIFI_RADIO1" -eq "1" ]]; then
			wifi1_irq=245
		fi
		#AX7800 - PCIE0
		if [[ "$WIFI_RADIO2" -eq "1" ]]; then
			wifi2_irq=246
		fi
		#AX7800 - PCIE1
		#if [[ "$WIFI_RADIO3" -eq "1" ]]; then
		#	wifi3_irq=247
		#fi
	fi

	for vif in $NET_IF_LIST;
	do
		if [[ "$vif" == "wlan"* ]] || [[ "$vif" == "phy"* ]]; then
			WIFI_IF_LIST="$WIFI_IF_LIST $vif"
		fi
	done;
	dbg2 "$WIFI_IF_LIST = $WIFI_IF_LIST"
	# Please update the CPU binding in each cases.
	# CPU#_AFFINITY="add binding irq number here"
	# CPU#_RPS="add binding interface name here"
	if [ "$num_of_wifi" = "0" ]; then
		CPU0_AFFINITY="$eth_irq_rx0"
		CPU1_AFFINITY="$eth_irq_rx1 $eth_irq_tx"
		CPU2_AFFINITY="$eth_irq_rx2"
		CPU3_AFFINITY="$eth_irq_rx3"

		CPU0_RPS=""
		CPU1_RPS=""
		CPU2_RPS=""
		CPU3_RPS=""
	else
		#we bound all wifi card to cpu1 and bound eth to cpu0
		CPU0_AFFINITY="$eth_irq_rx0"
		CPU1_AFFINITY="$eth_irq_rx1 $eth_irq_tx"
		CPU2_AFFINITY="$eth_irq_rx2 $wifi2_irq $wifi3_irq"
		CPU3_AFFINITY="$eth_irq_rx3 $wifi1_irq"

		CPU0_RPS="$WIFI_IF_LIST"
		CPU1_RPS="$WIFI_IF_LIST"
		CPU2_RPS="$WIFI_IF_LIST"
		CPU3_RPS="$WIFI_IF_LIST"
	fi
	dbg2 "CPU0_AFFINITY = $CPU0_AFFINITY"
	dbg2 "CPU1_AFFINITY = $CPU1_AFFINITY"
	dbg2 "CPU2_AFFINITY = $CPU2_AFFINITY"
	dbg2 "CPU3_AFFINITY = $CPU3_AFFINITY"
}

MT7981()
{
	num_of_wifi=$1
	DEFAULT_RPS=0

	#Physical IRQ# setting
	eth_irq_rx=221
	eth_irq_tx=229
	wifi1_irq=
	wifi2_irq=
	wifi3_irq=
	#AX3000
	if [[ "$WIFI_RADIO1" -eq "1" ]]; then
		wifi1_irq=245
	fi
	# Please update the CPU binding in each cases.
	# CPU#_AFFINITY="add binding irq number here"
	# CPU#_RPS="add binding interface name here"
	if [ "$num_of_wifi" = "0" ]; then
		CPU0_AFFINITY="$eth_irq_rx"
		CPU1_AFFINITY="$eth_irq_tx"

		CPU0_RPS="$RPS_IF_LIST"
		CPU1_RPS="$RPS_IF_LIST"
	else
		#we bound all wifi card to cpu0 and bound eth to cpu1
		CPU0_AFFINITY="$wifi1_irq $wifi2_irq $wifi3_irq"
		CPU1_AFFINITY="$eth_irq_rx $eth_irq_tx"

		CPU0_RPS="$RPS_IF_LIST"
		CPU1_RPS="$RPS_IF_LIST"
	fi
	dbg2 "CPU0_AFFINITY = $CPU0_AFFINITY"
	dbg2 "CPU1_AFFINITY = $CPU1_AFFINITY"
}

MT7622()
{
	num_of_wifi=$1
	DEFAULT_RPS=0

	#Physical IRQ# setting
	eth0_irq=224
	eth1_irq=225
	wifi1_irq=
	wifi2_irq=
	wifi3_irq=
	#AX1200 AX3200
	if [[ "$WIFI_RADIO1" -eq "1" ]]; then
		wifi1_irq=211
	fi
	#AX1800 AX3200
	if [[ "$WIFI_RADIO2" -eq "1" ]]; then
		wifi2_irq=214
	fi
	#AX3600
	if [[ "$WIFI_RADIO3" -eq "1" ]]; then
		wifi3_irq=215
	fi

	# Please update the CPU binding in each cases.
	# CPU#_AFFINITY="add binding irq number here"
	# CPU#_RPS="add binding interface name here"
	if [ "$num_of_wifi" == "0" ]; then
		CPU0_AFFINITY="$eth0_irq"
		CPU1_AFFINITY="$eth1_irq"

		CPU0_RPS="$RPS_IF_LIST"
		CPU1_RPS="$RPS_IF_LIST"
	else
		#we bound all wifi card to cpu0 and bound eth to cpu1
		CPU0_AFFINITY="$wifi1_irq $wifi2_irq $wifi3_irq"
		CPU1_AFFINITY="$eth0_irq $eth1_irq"

		CPU0_RPS="$RPS_IF_LIST"
		CPU1_RPS="$RPS_IF_LIST"
	fi

	dbg2 "CPU0_AFFINITY = $CPU0_AFFINITY"
	dbg2 "CPU1_AFFINITY = $CPU1_AFFINITY"
}

setup_model()
{
	board=$(board_name)
	num_of_wifi=$NUM_WIFI_CARD

	if [[ $board == *"7988"* ]]; then
		dbg "setup_model: MT7988 NUM_WIFI_CARD=$num_of_wifi"
		MT7988 $num_of_wifi
	elif [[ $board == *"7986"* ]]; then
		dbg "setup_model: MT7986 NUM_WIFI_CARD=$num_of_wifi"
		MT7986 $num_of_wifi
	elif [[ $board == *"7981"* ]]; then
		dbg "setup_model: MT7981 NUM_WIFI_CARD=$num_of_wifi"
		MT7981 $num_of_wifi
	elif [[ $board == *"7622"* ]]; then
		dbg "setup_model: MT7622 NUM_WIFI_CARD=$num_of_wifi"
		MT7622 $num_of_wifi
	fi
}

get_virtual_irq()
{
	PHY_POS=`expr $NUM_OF_CPU + 3` #physical irq # position in /proc/interrups may vary with the number of CPU up
	target_phy_irq=$1
	cat /proc/interrupts | sed 's/:/ /g'| awk '$1 ~ /^[0-9]+$/' | while read line
	do
		set -- $line
		phy_irq=$(eval "echo \$$PHY_POS")
		if [ $phy_irq == $target_phy_irq ]; then
			echo $1
			return
		fi
	done
}

set_rps_cpu_bitmap()
{
	dbg2 "# Scan binding interfaces of each cpu"
	# suppose the value of interface_var is null or hex
	num=0
	while [ "$num" -lt "$NUM_OF_CPU" ];do
		cpu_bit=$((2 ** $num))
		eval rps_list=\$CPU${num}_RPS
		dbg2 "# CPU$num: rps_list=$rps_list"
		for i in $rps_list; do
			var=${VAR_PREFIX}_${i//-/_}
			eval ifval=\$$var
			dbg2 "[var val before] \$$var=$ifval"
			if [ -z "$ifval" ]; then
				eval $var=$cpu_bit
			else
				eval $var=`expr $ifval + $cpu_bit`
			fi
			eval ifval=\$$var
			dbg2 "[rps val after]$i=$ifval"
		done
		num=`expr $num + 1`
	done
}

# $1: The default rps value. If rps of the interface is not setup, set $1 to it
set_rps_cpus()
{
	dbg2 "# Setup rps of the interfaces, $RPS_IF_LIST."
	for i in $RPS_IF_LIST; do
		var=${VAR_PREFIX}_${i//-/_}
		eval cpu_map=\$$var
		if [ -d /sys/class/net/$i ]; then
			if [ ! -z $cpu_map ]; then
				cpu_map=`printf '%x' $cpu_map`
				dbg "echo $cpu_map > /sys/class/net/$i/queues/rx-0/rps_cpus"
				echo $cpu_map > /sys/class/net/$i/queues/rx-0/rps_cpus
			elif [ ! -z $1 ]; then
				dbg "echo $1 > /sys/class/net/$i/queues/rx-0/rps_cpus"
				echo $1 > /sys/class/net/$i/queues/rx-0/rps_cpus
			fi
		fi
	done
}

set_smp_affinity()
{
	dbg2 "# Setup affinity of each physical irq."
	num=0
	while [ "$num" -lt "$NUM_OF_CPU" ];do
		eval smp_list=\$CPU${num}_AFFINITY
		for i in $smp_list; do
			cpu_bit=$((2 ** $num))
			virq=$(get_virtual_irq $i)
			#virq=$i
			dbg2 "irq p2v $i --> $virq"
			if [ ! -z $virq ]; then
				dbg "echo $cpu_bit > /proc/irq/$virq/smp_affinity"
				echo $cpu_bit > /proc/irq/$virq/smp_affinity
			fi
		done
		num=`expr $num + 1`
	done
}

if [ "$1" = "dbg" ]; then
	DBG=1
elif [ "$1" = "dbg2" ]; then
	DBG=2
else
	DBG=0
fi

# Usage: dbg "the output string"
dbg()
{
	if [ "$DBG" -ge "1" ]; then
		echo -e $1
	fi
}

# Usage: dbg2 "the output string"
dbg2()
{
	if [ "$DBG" -ge "2" ]; then
		echo -e $1
	fi
}

dbg "# RPS and AFFINITY Setting"
dbg "# NUM_OF_CPU=$NUM_OF_CPU"
VAR_PREFIX="autogen"
get_if_info
setup_model
set_rps_cpu_bitmap
set_rps_cpus $DEFAULT_RPS
set_smp_affinity
#end of file
