| #! /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 |
| |