#!/bin/sh . "${PM_FUNCTIONS}" # See if we have the usual wireless tools. # Do not just fail because not all cards require these. which iwpriv >/dev/null 2>&1 && have_iwpriv="true" which iwconfig >/dev/null 2>&1 && have_iwconfig="true" # If only all the drivers did The Right Thing with iwconfig power. # Too bad they do not. get_wireless_params() { # $1 = interface # $2 = on or off unset iwpriv iwconfig iwlevel # Don't do anything if we cannot find a driver for this iface. [ -L "/sys/class/net/$1/device/driver" ] || return 1 # Skip if not a wireless card. [ -d "/sys/class/net/$1/wireless" ] || return 1 # Also don't do anything if the device is disabled [ "$(cat /sys/class/net/$1/device/enabled)" = "1" ] || return 1 driver="$(readlink "/sys/class/net/$1/device/driver")" driver=${driver##*/} case $driver in ipw2100) iwpriv_ac="set_power 0" iwpriv_batt="set_power 5" iwconfig_ac="power on" iwconfig_batt="power on";; ipw3945) iwpriv_ac="set_power 6" iwpriv_batt="set_power 7";; iwl*) if [ -f "/sys/class/net/$1/device/power_level" ]; then iwlevel_ac=0 iwlevel_batt=3 else iwconfig_ac="power off" iwconfig_batt="power on" fi;; *) iwconfig_ac="power off" iwconfig_batt="power on";; esac case $2 in off) [ "$iwpriv_ac" ] && iwpriv="$iwpriv_ac" [ "$iwconfig_ac" ] && iwconfig="$iwconfig_ac" [ "$iwlevel_ac" ] && iwlevel="$iwlevel_ac";; on) [ "$iwpriv_batt" ] && iwpriv="$iwpriv_batt" [ "$iwconfig_batt" ] && iwconfig="$iwconfig_batt" [ "$iwlevel_batt" ] && iwlevel="$iwlevel_batt";; esac return 0 } wireless_powersave() { for dev in /sys/class/net/*; do get_wireless_params "${dev##*/}" "$1" || continue ret=0 printf "Turning powersave for %s %s..." "${dev##*/}" "$1" if [ "$have_iwconfig" = true -a "$iwconfig" ]; then iwconfig "${dev##*/}" $iwconfig || ret=1 fi if [ "$have_iwpriv" = true -a "$iwpriv" ]; then iwpriv "${dev##*/}" $iwpriv || ret=1 fi if [ "$iwlevel" ]; then echo "$iwlevel" > "$dev/device/power_level" || ret=1 fi [ "$ret" -eq 0 ] && echo Done. || echo Failed. done } case $1 in true) wireless_powersave on ;; false) wireless_powersave off ;; *) exit $NA ;; esac exit 0