Subject: acpi-support: wireless control button does not work on Asus A3A Package: acpi-support Version: 0.130-1 Severity: normal Tags: patch
Hi, I had some trouble get wireless control button (Fn+F2) on my Asus A3A laptop to work and managed to wrote a patch for this functionality, hope you find it useful. I use ipw2200 driver with my wifi. Basic changes done: /usr/share/acpi-support/state-funcs - /sys/class/net/*/wireless directory does not exist in my system, reading through some forum posts I found that this interface is deprecated, so probably it was removed some time ago. As a workaround, I obtained names of wireless interfaces by parsing /proc/net/wireless file. added new file /etc/acpi/events/asus-wireless-toggle - event generated by the button was not recognized by acpid, this file handles the event calling /etc/acpi/asus-wireless.sh with no arguments --- /usr/share/acpi-support/state-funcs 2009-12-20 21:45:57.000000000 +0100 +++ /home/haakon/state-funcs 2009-12-21 14:30:57.000000000 +0100 @@ -1,28 +1,30 @@ # Paul Sladen, 2006-03-28, 2007-03-26 # Library functions to check/change status of wireless +IFACE_NAMES=`cut -d: -f1 -s /proc/net/wireless` + # Return 0 if there is, allowing you to write if isAnyWirelessPoweredOn; then ... isAnyWirelessPoweredOn() { - for DEVICE in /sys/class/net/* ; do - if [ -d $DEVICE/wireless ]; then - for RFKILL in $DEVICE/phy80211/rfkill*/state $DEVICE/device/rfkill/rfkill*/state - do - if [ -r "$RFKILL" ] && [ "$(cat "$RFKILL")" -eq 1 ] - then - return 0 - fi - done - # if any of the wireless devices are turned on then return success - if [ -r $DEVICE/device/power/state ] && [ "`cat $DEVICE/device/power/state`" -eq 0 ] - then - return 0 - fi - if [ -r $DEVICE/device/rf_kill ] && [ "`cat $DEVICE/device/rf_kill`" -eq 0 ] - then - return 0 - fi - fi + for NET_IF in $IFACE_NAMES ; do + DEVICE=/sys/class/net/$NET_IF + + for RFKILL in $DEVICE/phy80211/rfkill*/state $DEVICE/device/rfkill/rfkill*/state + do + if [ -r "$RFKILL" ] && [ "$(cat "$RFKILL")" -eq 1 ] + then + return 0 + fi + done + # if any of the wireless devices are turned on then return success + if [ -r $DEVICE/device/power/state ] && [ "`cat $DEVICE/device/power/state`" -eq 0 ] + then + return 0 + fi + if [ -r $DEVICE/device/rf_kill ] && [ "`cat $DEVICE/device/rf_kill`" -eq 0 ] + then + return 0 + fi done # otherwise return failure @@ -35,75 +37,72 @@ # will fail on >=2.6.18 kernels since upstream removed the functionality... toggleAllWirelessStates() { - for DEVICE in /sys/class/net/* ; do - if [ -d $DEVICE/wireless ] ; then - # $DEVICE is a wireless device. - NET_IF=`echo $DEVICE | cut -d \/ -f 5` - - FOUND= - # Yes, that's right... the new interface reverses the truth values. - ON=1 - OFF=0 - for CONTROL in $DEVICE/phy80211/rfkill*/state $DEVICE/device/rfkill/rfkill*/state; do - if [ -w "$CONTROL" ]; then - FOUND=1 - - if [ "$(cat "$CONTROL")" = "$ON" ] ; then - # It's powered on. Switch it off. - echo -n "$OFF" > "$CONTROL" - else - # It's powered off. Switch it on. - echo -n "$ON" > "$CONTROL" - fi - fi - done - # it might be safe to assume that a device only supports one - # interface at a time; but just in case, we short-circuit - # here to avoid toggling the power twice - if [ -n "$FOUND" ]; then - continue - fi - - ON=0 - OFF=1 # 1 for rf_kill, 2 for power/state - for CONTROL in $DEVICE/device/rf_kill $DEVICE/device/power/state ; do - if [ -w $CONTROL ] ; then - # We have a way of controlling the device, lets try - if [ "`cat $CONTROL`" = 0 ] ; then - # It's powered on. Switch it off. - if echo -n $OFF > $CONTROL ; then - ifdown "${NET_IF}" - break - else - OFF=2 # for power/state, second time around - fi - else - # It's powered off. Switch it on. - if echo -n $ON > $CONTROL ; then - ifup "${NET_IF}" - if [ -x /sbin/wpa_cli ]; then - wpa_cli scan - fi - break - fi - fi - fi - done - - # For madwifi we need to check "operstate" instead. - if [ -w $DEVICE/operstate ] ; then - if [ "`cat $DEVICE/operstate`" = "up" ] ; then - # It's powered on. Switch it off. - ifdown $NET_IF - else - # It's powered off. Switch it on. - ifup $NET_IF - if [ -x /sbin/wpa_cli ] ; then - wpa_cli scan - fi - fi - fi - fi + for NET_IF in $IFACE_NAMES ; do + DEVICE=/sys/class/net/$NET_IF + + FOUND= + # Yes, that's right... the new interface reverses the truth values. + ON=1 + OFF=0 + for CONTROL in $DEVICE/phy80211/rfkill*/state $DEVICE/device/rfkill/rfkill*/state; do + if [ -w "$CONTROL" ]; then + FOUND=1 + + if [ "$(cat "$CONTROL")" = "$ON" ] ; then + # It's powered on. Switch it off. + echo -n "$OFF" > "$CONTROL" + else + # It's powered off. Switch it on. + echo -n "$ON" > "$CONTROL" + fi + fi + done + # it might be safe to assume that a device only supports one + # interface at a time; but just in case, we short-circuit + # here to avoid toggling the power twice + if [ -n "$FOUND" ]; then + continue + fi + + ON=0 + OFF=1 # 1 for rf_kill, 2 for power/state + for CONTROL in $DEVICE/device/rf_kill $DEVICE/device/power/state ; do + if [ -w $CONTROL ] ; then + # We have a way of controlling the device, lets try + if [ "`cat $CONTROL`" = 0 ] ; then + # It's powered on. Switch it off. + if echo -n $OFF > $CONTROL ; then + ifdown "${NET_IF}" + break + else + OFF=2 # for power/state, second time around + fi + else + # It's powered off. Switch it on. + if echo -n $ON > $CONTROL ; then + ifup "${NET_IF}" + if [ -x /sbin/wpa_cli ]; then + wpa_cli scan + fi + break + fi + fi + fi + done + + # For madwifi we need to check "operstate" instead. + if [ -w $DEVICE/operstate ] ; then + if [ "`cat $DEVICE/operstate`" = "up" ] ; then + # It's powered on. Switch it off. + ifdown $NET_IF + else + # It's powered off. Switch it on. + ifup $NET_IF + if [ -x /sbin/wpa_cli ] ; then + wpa_cli scan + fi + fi + fi done } Contents of /etc/acpi/asus-wireless.sh: event=button/wlan WLAN 00000080 action=/etc/acpi/asus-wireless.sh -- System Information: Debian Release: squeeze/sid APT prefers testing APT policy: (500, 'testing'), (500, 'stable') Architecture: i386 (i686) Kernel: Linux 2.6.30-2-686 (SMP w/1 CPU core) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages acpi-support depends on: ii acpi-support-base 0.130-1 scripts for handling base ACPI eve ii acpid 1.0.10-5 Advanced Configuration and Power I ii dmidecode 2.9-1.1 Dump Desktop Management Interface ii finger 0.17-13 user information lookup program ii hdparm 9.15-1 tune hard disk parameters for high ii laptop-detect 0.13.7 attempt to detect a laptop ii libc6 2.10.2-2 GNU C Library: Shared libraries ii lsb-base 3.2-23 Linux Standard Base 3.2 init scrip ii pm-utils 1.2.6.1-3 utilities and scripts for power ma ii powermgmt-base 1.30+nmu1 Common utils and configs for power ii x11-xserver-utils 7.5+1 X server utilities Versions of packages acpi-support recommends: ii dbus 1.2.16-2 simple interprocess messaging syst ii hal 0.5.13-6 Hardware Abstraction Layer ii nvclock 0.8b4-1 Allows you to overclock your nVidi ii radeontool 1.5-5 utility to control ATI Radeon back ii toshset 1.75-1 Access much of the Toshiba laptop acpi-support suggests no packages. -- no debconf information
<<attachment: jakub_adam.vcf>>