#!/bin/sh
#
# Copyright (C) 2016, TP-LINK TECHNOLOGIES CO., LTD.
# Author: Li Yijie <liyijie@tp-link.com.cn>
# Date:   2019-05-24
#

HELP="Usage: $0 {lsmod | insmod | rmmod | tmpd_insmod | interface_up | mp_start | mp_stop | efuse_file | efuse_mask}"

MODULE_BASE=/lib/modules/$(uname -r)
MODULE_NAME=ssv6x5x
MODULE_CFG_FILE=/etc/icomm/ssv6x5x-wifi.cfg
IFACE=wlan0

show_log() {
	# 重定向到串口输出，不会被管道捕获
	echo “[wlan_operate] $*” > /dev/console
}

ls_driver() {
	lsmod | grep ${MODULE_NAME}
}

insmod_driver() {
	insmod ${MODULE_NAME} stacfgpath=${MODULE_CFG_FILE}
}

rmmod_driver() {
	rmmod ${MODULE_NAME}
}

wait_for_driver_to_be_ready() {
	ifconfig ${IFACE} > /dev/null 2>&1
	rc=$?

	while [ $rc -ne 0 ]; do
		echo "wlan: driver is not ready, wait..." >> /dev/kmsg
		sleep 1s
		ifconfig ${IFACE} > /dev/null 2>&1
		rc=$?
	done
}

tmpd_insmod_driver() {
	local wifi_enable_gpio=`echo $@ | cut -d ' '  -f 1`
	local wifi_gpio_active_low=`echo $@ | cut -d ' '  -f 2`

	local have_driver="`ls $MODULE_BASE | grep ${MODULE_NAME}`"

	if [ -n "$have_driver" ]; then
		echo "driver not in kernel" >> /dev/kmsg

		loaded="`lsmod | grep ${MODULE_NAME}`"

		if [ -z "$loaded" ]; then
			echo "driver not insmod, reset wifi gpio(${wifi_enable_gpio},${wifi_gpio_active_low})" >> /dev/kmsg
			echo ${wifi_enable_gpio} > /sys/class/gpio/unexport
			echo ${wifi_enable_gpio} > /sys/class/gpio/export
			echo out > /sys/class/gpio/gpio${wifi_enable_gpio}/direction
			if [ ${wifi_gpio_active_low} -eq 0 ]; then
				echo 0 > /sys/class/gpio/gpio${wifi_enable_gpio}/value
				sleep 1s
				echo 1 > /sys/class/gpio/gpio${wifi_enable_gpio}/value
				sleep 2s
			else
				echo 1 > /sys/class/gpio/gpio${wifi_enable_gpio}/value
				sleep 1s
				echo 0 > /sys/class/gpio/gpio${wifi_enable_gpio}/value
				sleep 2s
			fi
		else
			echo "driver is insmod, do rmmod" >> /dev/kmsg
			rmmod_driver
		fi

		echo "insmod driver" >> /dev/kmsg
		insmod_driver
	fi

	wait_for_driver_to_be_ready
}

interface_up() {
	ifconfig ${IFACE} up
}

wlan_mp_start() {
	show_log “current not use”
}

wlan_mp_stop() {
	show_log “current not use”
}

wlan_efuse_file() {
	show_log “current not use”
}

wlan_efuse_mask() {
	show_log “current not use”
}

wlan_efuse_get_temp() {
	show_log “current not use”
}

wlan_efuse_set_temp() {
	show_log “current not use”
}

wlan_get_temp() {
	show_log “current not use”
}

wlan_get_rxstatus() {
	rf count 1
}

wlan_efuse_get_devid() {
	show_log “current not use”
}

wlan_efuse_set_devid() {
	show_log “current not use”
}

wlan_efuse_get_power_gain() {
	show_log “current not use”
}

wlan_efuse_set_power_gain() {
	show_log “current not use”
}

wlan_efuse_sync() {
	show_log “current not use”
}

wlan_bandwidth_ht20() {
	show_log “current not use”
}

wlan_bandwidth_ht40() {
	show_log “current not use”
}

wlan_set_channel() {
	show_log "rf ch $1"
	rf ch $@ > /dev/null
}

wlan_set_rate() {
	show_log "rf rate $@"
	rf rate $@
}

wlan_set_txchain() {
	show_log “current not use”
}

wlan_set_rxchain() {
	show_log “current not use”
}

wlan_set_txpower() {
	show_log “current not use”
}

wlan_set_tx_enable() {
	show_log "rf tx"
	rf tx > /dev/null
}

wlan_set_tx_disable() {
	show_log "rf stop"
	rf stop > /dev/null
}

wlan_set_rx_enable() {
	show_log "rf rx"
	rf rx > /dev/null
}

wlan_set_rx_disable() {
	show_log "rf stop"
	rf stop > /dev/null
}

wlan_set_rx_reset() {
	show_log "rf reset"
	rf reset
}

wlan_set_xcap() {
	show_log "rf freq $1"
	local gain=$1
	rf freq $1 > /dev/null
}

wlan_get_xcap() {
	show_log "rf rfreq"
	rf rfreq
}

wlan_set_efuse_priv() {
	show_log “current not use”
}

wlan_get_efuse_priv() {
	show_log “current not use”
}

wlan_get_xcap_efuse() {
	show_log “current not use”
}

### /****** script business functions ###

# args: band=[2g,5g]
wlan_get_reg_power_gain() {
	export $@
	show_log "get_reg_power_gain:args is $@"

	if [ "$band" = "2g" ]; then
		show_log "cli reg r ccb0adac"
		cli reg r ccb0adac
	elif [ "$band" = "5g" ]; then
		show_log "cli reg r ccb0ada8"
		cli reg r ccb0ada8
	fi
}

# args: band=[2g,5g] gain=yy
wlan_set_reg_power_gain() {
	export $@
	show_log "set_reg_power_gain:args is $@"

	if [ -z "$band" ] || [ -z "$gain" ]; then
		return
	fi

	if [ "$band" = "2g" ]; then
		show_log "cli reg w ccb0adac $gain"
		cli reg w ccb0adac $gain
	elif [ "$band" = "5g" ]; then
		show_log "cli reg w ccb0ada8 $gain"
		cli reg w ccb0ada8 $gain
	fi
}

# args: band=[2g,5g,dual]
wlan_get_efuse_cal_data() {
	export $@
	show_log "get_efuse_cal_data:args is $@"

	if [ "$band" = "2g" ]; then
		freq=$(cli efuse r freq)
		txpower1=$(cli efuse r txpower1)

		echo "band=$band freq=$freq txpower1=$txpower1"
	fi

	if [ "$band" = "5g" ] || [ "$band" = "dual" ]; then
		freq=$(cli efuse r freq)
		txpower1=$(cli efuse r txpower1)
		txpower2=$(cli efuse r txpower2)

		echo "band=$band freq=$freq txpower1=$txpower1 txpower2=$txpower2"
	fi
}

# args: freq=xx txpower1=yy txpower2=zz
wlan_set_efuse_cal_data() {
	export $@
	show_log "set_efuse_cal_data:args is $@"

	if [ -n "$freq" ]; then
		show_log "cli efuse w freq $freq"
		cli efuse w freq $freq
	fi

	if [ -n "$txpower1" ]; then
		show_log "cli efuse w txpower1 $txpower1"
		cli efuse w txpower1 $txpower1
	fi

	if [ -n "$txpower2" ]; then
		show_log "cli efuse w txpower2 $txpower2"
		cli efuse w txpower2 $txpower2
	fi
}

# args:
wlan_get_efuse_test_data() {
	show_log "cli efuse r mac"
	cli efuse r mac
}

# args: data=xx
wlan_set_efuse_test_data() {
	export $@
	show_log "set_efuse_test_data:args is $@"

	show_log "cli efuse w mac $data"
	cli efuse w mac $data
}

### script business functions ******/ ###


# wlan_operate <action>
wlan_operate() {
	local action="$1"
	local param1=$2

	case "$action" in
		"lsmod")
			ls_driver
			;;
		"insmod")
			insmod_driver
			;;
		"rmmod")
			rmmod_driver
			;;
		"tmpd_insmod")
			shift
			tmpd_insmod_driver $@
			;;
		"interface_up")
			interface_up
			;;
		"mp_start")
			wlan_mp_start
			;;
		"mp_stop")
			wlan_mp_stop
			;;
		"efuse_file")
			wlan_efuse_file
			;;
		"efuse_mask")
			wlan_efuse_mask
			;;
		"efuse_get_temp")
			wlan_efuse_get_temp
			;;
		"efuse_set_temp")
			wlan_efuse_set_temp $param1
			;;
		"get_temp")
			wlan_get_temp
			;;
		"get_rxstatus")
			shift
			wlan_get_rxstatus $@
			;;
		"efuse_get_devid")
			wlan_efuse_get_devid
			;;
		"efuse_set_devid")
			wlan_efuse_set_devid $param1
			;;
		"efuse_get_power_gain")
			wlan_efuse_get_power_gain
			;;
		"efuse_set_power_gain")
			wlan_efuse_set_power_gain $param1
			;;
		"efuse_sync")
			wlan_efuse_sync
			;;
		"bandwidth_ht20")
			wlan_bandwidth_ht20
			;;
		"bandwidth_ht40")
			wlan_bandwidth_ht40
			;;
		"set_channel")
			wlan_set_channel $param1
			;;
		"set_rate")
			shift
			wlan_set_rate $@
			;;
		"set_txchain")
			wlan_set_txchain $param1
			;;
		"set_rxchain")
			wlan_set_rxchain $param1
			;;
		"set_txpower")
			shift
			wlan_set_txpower $@
			;;
		"set_tx_enable")
			wlan_set_tx_enable
			;;
		"set_tx_disable")
			wlan_set_tx_disable
			;;
		"set_rx_enable")
			wlan_set_rx_enable
			;;
		"set_rx_disable")
			wlan_set_rx_disable
			;;
		"set_rx_reset")
			wlan_set_rx_reset
			;;
		"set_xcap")
			wlan_set_xcap $param1
			;;
		"get_xcap")
			wlan_get_xcap
			;;
		"get_xcap_efuse")
			wlan_get_xcap_efuse
			;;
		"set_efuse_priv")
			shift
			wlan_set_efuse_priv $@
			;;
		"get_efuse_priv")
			wlan_get_efuse_priv
			;;
		"get_reg_power_gain")
			shift
			wlan_get_reg_power_gain $@
			;;
		"set_reg_power_gain")
			shift
			wlan_set_reg_power_gain $@
			;;
		"get_efuse_cal_data")
			shift
			wlan_get_efuse_cal_data $@
			;;
		"set_efuse_cal_data")
			shift
			wlan_set_efuse_cal_data $@
			;;
		"get_efuse_test_data")
			shift
			wlan_get_efuse_test_data $@
			;;
		"set_efuse_test_data")
			shift
			wlan_set_efuse_test_data $@
			;;
		*)
			echo "wlan_operate: invalid action: $action" >> /dev/kmsg
			return 1
			;;
	esac

	return 0
}

wlan_operate $@
if [ $? -ne 0 ]; then
	echo $HELP >&2
	exit 1
fi

exit 0
