blob: f53730309452508e989cf2a4c54133217bba84e5 [file] [log] [blame]
#! /bin/sh
#
# Laptop mode tools module: power saving for IPW3945, IPW2200 and IPW2100 using
# the Intel ipw drivers.
#
#
# This script relies upon the name of the driver.
#
# Original source: http://ubuntuforums.org/showthread.php?t=419772
if [ x$CONTROL_IPW_POWER = x1 ] ; then
# Provide defaults for config file settings
[ "$IPW3945_AC_POWER" ] || IPW3945_AC_POWER=6
[ "$IPW3945_BATT_POWER" ] || IPW3945_BATT_POWER=7
[ "$IPW2100_AC_POWER" ] || IPW3945_AC_POWER=0
[ "$IPW2100_BATT_POWER" ] || IPW3945_BATT_POWER=5
I3945_DRIVERNAME=ipw3945
I2200_DRIVERNAME=ipw2200
I2100_DRIVERNAME=ipw2100
# find executables
if [ -x /sbin/iwpriv ] ; then
IWPRIV=/sbin/iwpriv
elif [ -x /usr/sbin/iwpriv ] ; then
IWPRIV=/usr/sbin/iwpriv
else
log "VERBOSE" "iwpriv is not installed"
fi
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"
fi
SET_I3945_AC_PARMS="set_power $IPW3945_AC_POWER"
SET_I3945_BAT_PARMS="set_power $IPW3945_BATT_POWER"
SET_I2200_AC_PARMS="power off"
SET_I2200_BAT_PARMS="power on"
# Note the fact that we're setting "power on" on both AC and battery.
# This is due to the fact that the second statement will have no effect
# if we turn power management off completely, and some laptops will
# reportedly get very hot if you turn off power management on the
# IPW2100.
SET_I2100_AC_PARMS_1="power on"
SET_I2100_BAT_PARMS_1="power on"
SET_I2100_AC_PARMS_2="set_power $IPW2100_AC_POWER"
SET_I2100_BAT_PARMS_2="set_power $IPW2100_BATT_POWER"
#
# Find all the wireless devices using the supplied driver names.
# Place the interface names on the list WIFI_IFNAMES.
#
findWifiIfsByDriver() {
local DEVICE;
local LINK_TARGET;
local ENABLED;
WIFI_IFNAMES=""
for DEVICE in /sys/class/net/*; do
if [ -d $DEVICE/wireless -a -h $DEVICE/device/driver ]; then
# See if the driver for $DEVICE matches the supplied one by checking the link to
# the driver.
LINK_TARGET=`readlink $DEVICE/device/driver`
LINK_TARGET=${LINK_TARGET##*/}
ENABLED=`cat $DEVICE/device/enable`
if [ $ENABLED -eq 1 -a "$LINK_TARGET" = "$1" ]; then
# add the interface name to the list
WIFI_IFNAMES="$WIFI_IFNAMES ${DEVICE##*/}"
else
log "VERBOSE" "$DEVICE doesn't seem to be enabled. Radio Switched off?";
fi
else
# LP: #369113
# Kernel's 2.6.29 and above have been reported to be missing
# the $DEVICE/wireless folder.
dev=`basename $DEVICE`
$IWCONFIG $dev >/dev/null 2>&1;
ret=$?;
if [ "$ret" = "0" ]; then
# add the interface name to the list
WIFI_IFNAMES="$WIFI_IFNAMES ${DEVICE##*/}"
fi
fi
done
}
#
# Set all the adaptors using the supplied driver into the supplied
# power saving mode
#
# $1 - driver name
# $2 - power command
# $3 - power command arguments
#
setWifiPwrSave () {
local DEVICE;
findWifiIfsByDriver $1;
for DEVICE in $WIFI_IFNAMES; do
log "VERBOSE" "Wireless power saving: $2 $DEVICE $3"
$2 $DEVICE $3
done
}
intel3945_BatPwrSave () {
setWifiPwrSave "$I3945_DRIVERNAME" "$IWPRIV" "$SET_I3945_BAT_PARMS"
}
intel3945_AcPwrSave () {
setWifiPwrSave "$I3945_DRIVERNAME" "$IWPRIV" "$SET_I3945_AC_PARMS"
}
intel2200_BatPwrSave () {
setWifiPwrSave "$I2200_DRIVERNAME" "$IWCONFIG" "$SET_I2200_BAT_PARMS"
}
intel2200_AcPwrSave () {
setWifiPwrSave "$I2200_DRIVERNAME" "$IWCONFIG" "$SET_I2200_AC_PARMS"
}
intel2100_BatPwrSave () {
setWifiPwrSave "$I2100_DRIVERNAME" "$IWCONFIG" "$SET_I2100_BAT_PARMS_1"
setWifiPwrSave "$I2100_DRIVERNAME" "$IWPRIV" "$SET_I2100_BAT_PARMS_2"
}
intel2100_AcPwrSave () {
setWifiPwrSave "$I2100_DRIVERNAME" "$IWCONFIG" "$SET_I2100_AC_PARMS_1"
setWifiPwrSave "$I2100_DRIVERNAME" "$IWPRIV" "$SET_I2100_BAT_PARMS_2"
}
if [ $ON_AC -eq 1 ] ; then
[ -d /sys/module/$I3945_DRIVERNAME ] && intel3945_AcPwrSave
[ -d /sys/module/$I2200_DRIVERNAME ] && intel2200_AcPwrSave
[ -d /sys/module/$I2100_DRIVERNAME ] && intel2100_AcPwrSave
else
[ -d /sys/module/$I3945_DRIVERNAME ] && intel3945_BatPwrSave
[ -d /sys/module/$I2200_DRIVERNAME ] && intel2200_BatPwrSave
[ -d /sys/module/$I2100_DRIVERNAME ] && intel2100_BatPwrSave
fi
else
log "VERBOSE" "Intel IPW Wireless power setting is disabled."
fi