#!/bin/sh /etc/rc.common
#
# Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

START=00
STOP=95

mount_wifi_fw (){
	local emmc_part=""
	local nand_part=""
	local nor_part=""
	local primaryboot=""
	local part_name="0:WIFIFW"
	local ubi_part_name="rootfs"
	local arch=""
	local wifi_on_rootfs=""

	if mount | grep -q WIFI_FW; then
		return 0
	fi

	arch=$1
	primaryboot=$(cat /proc/boot_info/$part_name/primaryboot)
	if [ $primaryboot -eq 1 ]; then
		part_name="0:WIFIFW_1"
	fi

	if [ "$arch" == "IPQ6018" ]; then
		wifi_on_rootfs="1"
	fi

	emmc_part=$(find_mmc_part $part_name 2> /dev/null)
	nor_part=$(cat /proc/mtd | grep WIFIFW | awk '{print $1}' | sed 's/:$//')
	local nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${nor_part}`
	if [ -n "$wifi_on_rootfs" ]; then
		nand_part=$(find_mtd_part $ubi_part_name 2> /dev/null)
		if [ -n "$nand_part" ]; then
			emmc_part=""
		fi
	else
		nand_part=$(find_mtd_part $part_name 2> /dev/null)
	fi

	mkdir -p /lib/firmware/$arch/WIFI_FW
	if [ -n "$emmc_part" ]; then
		/bin/mount -t squashfs $emmc_part /lib/firmware/$arch/WIFI_FW > /dev/console 2>&1
		[ -f /rom/lib/firmware/$arch/WIFI_FW/q6_fw.mdt ] && cp /rom/lib/firmware/$arch/WIFI_FW/*.* /lib/firmware/$arch/WIFI_FW/
	elif [ -n "$nor_flash" ]; then
		local nor_mtd_part=$(find_mtd_part $part_name 2> /dev/null)
		/bin/mount -t squashfs $nor_mtd_part /lib/firmware/$arch/WIFI_FW > /dev/console 2>&1
	elif [ -n "$nand_part" ]; then
                if [ -n "$wifi_on_rootfs" ]; then
                       local PART=$(grep -w  "rootfs" /proc/mtd | awk -F: '{print $1}')
                else
                       local PART=$(grep -w  "WIFIFW" /proc/mtd | awk -F: '{print $1}')
                fi
		ubiattach -p /dev/$PART
		sync
		local ubi_part=$(find_mtd_part wifi_fw 2> /dev/null)
		/bin/mount -t squashfs $ubi_part /lib/firmware/$arch/WIFI_FW > /dev/console 2>&1
	fi
	if [ -f /lib/firmware/$arch/WIFI_FW/q6_fw.mdt ]; then
		echo " WIFI FW mount is successful" > /dev/console 2>&1
	fi

	if [ -d /lib/firmware/$arch/WIFI_FW/qcn9000 ]; then
		cd  /lib/firmware/ && mkdir -p qcn9000
		cd qcn9000 && ln -sf /lib/firmware/$arch/WIFI_FW/qcn9000/*.* .
	fi

	cd  /lib/firmware/$arch && ln -sf WIFI_FW/*.* .
	if [ -f /lib/firmware/$arch/WIFI_FW/firmware_rdp_feature.ini ]; then
		cd /lib/firmware
		ln -sf /lib/firmware/$arch/WIFI_FW/firmware_rdp_feature.ini .
	fi
	. /lib/read_caldata_to_fs.sh
	do_load_ipq4019_board_bin

	mkdir -p /vendor/firmware
	mv /lib/firmware/$arch/WIFI_FW/Data.msc /vendor/firmware
}

mount_adsp_fw (){
	local emmc_part=""
	local nand_part=""
	local nor_part=""
	local ubi_part_name="rootfs"
	local part_name="0:ADSPFW"
	local arch=""

	if mount | grep -q ADSP_FW; then
		return 0
	fi

	arch=$1
	emmc_part=$(find_mmc_part $part_name 2> /dev/null)
	nor_part=$(cat /proc/mtd | grep ADSPFW | awk '{print $1}' | sed 's/:$//')
	local nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${nor_part}`
	nand_part=$(find_mtd_part $ubi_part_name 2> /dev/null)
	mkdir -p /lib/firmware/$arch/ADSP_FW

	if [ -n "$emmc_part" ]; then
		/bin/mount -t squashfs $emmc_part /lib/firmware/$arch/ADSP_FW > /dev/console 2>&1
		[ -f /rom/lib/firmware/$arch/ADSP_FW/q6_fw.mdt ] && cp /rom/lib/firmware/$arch/ADSP_FW/*.* /lib/firmware/$arch/ADSP_FW/
	elif [ -n "$nor_flash" ]; then
		local nor_mtd_part=$(find_mtd_part $part_name 2> /dev/null)
		/bin/mount -t squashfs $nor_mtd_part /lib/firmware/$arch/ADSP_FW > /dev/console 2>&1
	elif [ -n "$nand_part" ]; then
		local PART=$(grep -w  "rootfs" /proc/mtd | awk -F: '{print $1}')
		ubiattach -p /dev/$PART
		sync
		local ubi_part=$(find_mtd_part adsp_fw 2> /dev/null)
		/bin/mount -t squashfs $ubi_part /lib/firmware/$arch/ADSP_FW > /dev/console 2>&1
	fi

	if [ -f /lib/firmware/$arch/ADSP_FW/image/adsp.mdt ]; then
		echo " ADSP FW mount is successful" > /dev/console 2>&1
	fi

	cd  /lib/firmware/$arch &&  ln -sf ADSP_FW/image/*.* .
	[ -d /lib/firmware/$arch/ADSP_FW/dspso ] && ln -sf /lib/firmware/$arch/ADSP_FW/dspso /dsp
}

boot() {
 . /lib/functions/system.sh
	local platform=$(grep -o "IPQ.*" /proc/device-tree/model | awk -F/ '{print $1}')
	local board=$(grep -o "IPQ.*" /proc/device-tree/model | awk -F/ '{print $2}')

	if [ "$platform" == "IPQ807x" ]; then
		mount_wifi_fw "IPQ8074"
	elif [ "$platform" == "IPQ6018" ]; then
		mount_wifi_fw "IPQ6018"
		case "$board" in
			AP-CP02*)
				mount_adsp_fw "IPQ6018"
				;;
		esac
	else
		echo "\nInvalid Target"
	fi
}

stop_wifi_fw() {
	local emmc_part=""
	local nand_part=""
	local nor_part=""
	local primaryboot=""
	local part_name="0:WIFIFW"
	local wifi_on_rootfs=""
	arch=$1

	if [ "$arch" == "IPQ6018" ]; then
		part_name="rootfs"
		wifi_on_rootfs="1"
	fi

	primaryboot=$(cat /proc/boot_info/$part_name/primaryboot)
	if [ $primaryboot -eq 1 ]; then
		part_name="${part_name}_1"
	fi

	emmc_part=$(find_mmc_part $part_name 2> /dev/null)
	nor_part=$(cat /proc/mtd | grep WIFIFW | awk '{print $1}' | sed 's/:$//')
	local nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${nor_part}`
	nand_part=$(find_mtd_part $part_name 2> /dev/null)
	if [ -n "$emmc_part" ]; then
		umount /lib/firmware/$arch/WIFI_FW
	elif [ -n "$nor_flash" ]; then
		local nor_mtd_part=$(find_mtd_part $part_name 2> /dev/null)
		umount /lib/firmware/$arch/WIFI_FW
	elif [ -n "$nand_part" ]; then
		umount /lib/firmware/$arch/WIFI_FW
		if [ -z "$wifi_on_rootfs" ]; then
			local PART=$(grep -w  "WIFIFW" /proc/mtd | awk -F: '{print $1}')
			ubidetach -f -p  /dev/$PART
			sync
		fi
	fi
}

stop_adsp_fw() {
	local emmc_part=""
	local nand_part=""
	local nor_part=""
	local part_name="0:ADSPFW"
	arch=$1

	emmc_part=$(find_mmc_part $part_name 2> /dev/null)
	nor_part=$(cat /proc/mtd | grep ADSPFW | awk '{print $1}' | sed 's/:$//')
	local nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${nor_part}`
	nand_part=$(find_mtd_part rootfs 2> /dev/null)
	if [ -n "$emmc_part" ]; then
		umount /lib/firmware/$arch/ADSP_FW
	elif [ -n "$nor_flash" ]; then
		local nor_mtd_part=$(find_mtd_part $part_name 2> /dev/null)
		umount /lib/firmware/$arch/ADSP_FW
	elif [ -n "$nand_part" ]; then
		umount /lib/firmware/$arch/ADSP_FW
	fi
}

stop() {
	local platform=$(grep -o "IPQ.*" /proc/device-tree/model | awk -F/ '{print $1}')
	local board=$(grep -o "IPQ.*" /proc/device-tree/model | awk -F/ '{print $2}')

	if [ "$platform" == "IPQ807x" ]; then
		stop_wifi_fw "IPQ8074"
	elif [ "$platform" == "IPQ6018" ]; then
		stop_wifi_fw "IPQ6018"
		case "$board" in
			AP-CP02*)
				stop_adsp_fw "IPQ6018"
				;;
		esac
	else
		echo "\nInvalid Target"
		return 0
	fi
	return 0
}
