#! /bin/sh
#
# Laptop mode tools module, called from /usr/sbin/laptop_mode.
# Configuration in /etc/laptop-mode/conf.d/wireless-power.conf.
#
# PURPOSE: power saving for generic wireless adapters that support
#          the iwconfig power command.
#

[ "$WIRELESS_POWER_SAVING_EXCLUDE_DRIVERS" ] || WIRELESS_POWER_SAVING_EXCLUDE_DRIVERS="iwl3945 iwl4965 iwlagn ipw3945 ipw2200 ipw2100"

#
# Find all the wireless devices that do not use an excluded driver.
# Place the interface names on the list WIFI_IFNAMES.
#
findWifiIfs () {
	local SYSDEVICE EXCLUDED LINK_TARGET DRIVER IFNAME EXCLUDED_DRIVER;

	for SYSDEVICE in /sys/class/net/*; do
		IFNAME=`basename $SYSDEVICE`

		# Check if it is a wireless device
		#
		# Inverting return values, we get "0" for wireless device,
		# and "1" for non-wireless device.
		($IWCONFIG $IFNAME 2>&1 | grep -q "no wireless extensions.") && ret=1 || ret=0
		if [ "$ret" = "0" ]; then
			# Yes, it is a wireless device.
			if [ -h $SYSDEVICE/device/driver ]; then
				# Read the driver name
				LINK_TARGET=`readlink $SYSDEVICE/device/driver`
				DRIVER=${LINK_TARGET##*/}

				EXCLUDED=0
				for EXCLUDED_DRIVER in $WIRELESS_POWER_SAVING_EXCLUDE_DRIVERS ; do
					if [ "$EXCLUDED_DRIVER" = "$DRIVER" ] ; then
						log "VERBOSE" "Wireless interface $IFNAME excluded for wireless-power by driver name."
						EXCLUDED=1
					fi
				done
				if [ $EXCLUDED = 0 ] ; then
					# add the interface name to the list
					WIFI_IFNAMES="$WIFI_IFNAMES $IFNAME"
				fi
			fi

		fi
	done
}

if [ x$CONTROL_WIRELESS_POWER_SAVING = x1 ] || [ x$ENABLE_AUTO_MODULES = x1 -a x$CONTROL_WIRELESS_POWER_SAVING = xauto ]; then
	log "VERBOSE" "Setting power saving for generic wireless interfaces."

	# Provide defaults for config file settings
	[ "$WIRELESS_AC_POWER_SAVING" ]   || WIRELESS_AC_POWER_SAVING=0
	[ "$WIRELESS_BATT_POWER_SAVING" ] || WIRELESS_BATT_POWER_SAVING=1

	# Find executables
	if [ -x /sbin/iwconfig ] ; then
		IWCONFIG=/sbin/iwconfig
	elif [ -x /usr/sbin/iwconfig ] ; then
		IWCONFIG=/usr/sbin/iwconfig
	else
		log "VERBOSE" "iwconfig is not installed"
		IWCONFIG=/bin/false
	fi

	# Translate 1 => on, 0 => off
	WIRELESS_AC_POWER_SAVING_ONOFF=off
	WIRELESS_BATT_POWER_SAVING_ONOFF=off
	[ "$WIRELESS_AC_POWER_SAVING" = 1 ] && WIRELESS_AC_POWER_SAVING_ONOFF=on
	[ "$WIRELESS_BATT_POWER_SAVING" = 1 ] && WIRELESS_BATT_POWER_SAVING_ONOFF=on

	WIFI_IFNAMES=""
	findWifiIfs
	for IF in $WIFI_IFNAMES ; do
		if [ $ON_AC -eq 1 ] ; then
			log "VERBOSE" "On AC power: setting power saving mode for $IF to $WIRELESS_AC_POWER_SAVING_ONOFF."
			if ( ! $IWCONFIG $IF power $WIRELESS_AC_POWER_SAVING_ONOFF ) ; then
				log "ERR" "Failed."
			fi
		else
			log "VERBOSE" "On battery: setting power saving mode for $IF to $WIRELESS_BATT_POWER_SAVING_ONOFF."
			if ( ! $IWCONFIG $IF power $WIRELESS_BATT_POWER_SAVING_ONOFF ) ; then
				log "ERR" "Failed."
			fi
		fi
	done
else
	log "VERBOSE" "Generic wireless interface power saving module is disabled."
fi

