#!/bin/sh
#===============================================================================
#
#  standby-actions
#
#  Copyright (C) 2019 by Digi International Inc.
#  All rights reserved.
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License version 2 as published by
#  the Free Software Foundation.
#
#
#  !Description: manage interfaces before suspending and after resuming from
#                suspend
#
#===============================================================================

if [ "${1}" == "pre" ]; then
	# Stop NetworkManager before suspend
	systemctl stop NetworkManager

	# Suspend wireless interfaces
	if [ -d "/proc/device-tree/wireless" ]; then
		for i in $(sed -ne 's,^\(wlan[0-9]\)=.*,\1,g;T;p' /var/run/ifstate | sort -r); do
			ifdown "${i}" && RESUME_IFACES="${RESUME_IFACES:+${RESUME_IFACES} }${i}"
		done

		echo ${RESUME_IFACES} > /tmp/suspend_wlan_ifaces
		[ -e /sys/module/ath6kl_sdio ] && rmmod ath6kl_sdio ath6kl_core && echo "301" > /tmp/suspend_wlan_device_id
		[ -e /sys/module/wlan ] && rmmod wlan && echo "50A" > /tmp/suspend_wlan_device_id
	fi

	# Suspend bluetooth interface
	if [ -d "/proc/device-tree/bluetooth" ]; then
		hciconfig hci0 2>&1 | grep -qs UP && touch /tmp/up_bt_on_resume
		systemctl stop bluetooth
		systemctl stop bluetooth-init
	fi

	# Configure Power LED for blinking in standby
	if [ -d "/sys/class/leds/power:green" ]; then
		# Configure LED for blinking
		echo timer > /sys/class/leds/power\:green/trigger
		# Turn LED on at max brightness
		echo 19 > /sys/class/leds/power\:green/brightness
		# Configure blinking timings
		echo 100 > /sys/class/leds/power\:green/delay_on
		echo 1000 > /sys/class/leds/power\:green/delay_off
	fi
elif [ "${1}" == "post" ]; then
	# Resume wireless interfaces
	if [ -d "/proc/device-tree/wireless" ]; then
		# Trigger wireless module loading event, and wait until the interface exists
		udevadm trigger --action=add --attr-match="modalias=pci:v0000168Cd0000003Esv*sd*bc*sc*i*"
		udevadm trigger --action=add --attr-match="modalias=sdio:c00v0271d0$(cat /tmp/suspend_wlan_device_id)"
		rm -rf /tmp/suspend_wlan_driver
		timeout 5 sh -c "while [ ! -d /sys/class/net/wlan0 ]; do sleep .2; done" 2>/dev/null

		# Bring up the interfaces that were brought down on suspend
		for i in $(cat /tmp/suspend_wlan_ifaces | tr ' ' '\n' | sort); do
			grep -qs "^${i}" /var/run/ifstate || ifup "${i}"
		done
		rm -f /tmp/suspend_wlan_ifaces
	fi

	# Resume NetworkManager after suspend
	systemctl start NetworkManager

	# Resume bluetooth interface
	if [ -d "/proc/device-tree/bluetooth" ]; then
		if [ -e "/tmp/up_bt_on_resume" ]; then
			systemctl start bluetooth-init
			systemctl start bluetooth
			rm -f /tmp/up_bt_on_resume
		fi
	fi

	# Configure Power LED solid on after resume
	if [ -d "/sys/class/leds/power:green" ]; then
		# Reset LED settings by writing 0 to brigtness descriptor
		echo 0 > /sys/class/leds/power\:green/brightness
		# Turn LED on at max brightness
		echo 19 > /sys/class/leds/power\:green/brightness
	fi
fi
