Re: [RFT] hp-wmi: improved rfkill support for wifi

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2009/7/20 Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx>:>> ...and here's the version that remembers to register the bluetooth.  I> reviewed the patch again; hopefully that's the last dumb error.[...]
2.6.31-rc3+ patches:http://lkml.org/lkml/2009/7/18/131http://lkml.org/lkml/2009/7/10/339+ patch below:
> diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c> index 517ac47..adb26d3 100644> --- a/drivers/platform/x86/hp-wmi.c> +++ b/drivers/platform/x86/hp-wmi.c> @@ -51,6 +51,12 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");>  #define HPWMI_WIRELESS_QUERY 0x5>  #define HPWMI_HOTKEY_QUERY 0xc>> +enum hp_wmi_radio {> +       HPWMI_WIFI = 0,> +       HPWMI_BLUETOOTH = 1,> +       HPWMI_WWAN = 2,> +};> +>  static int __init hp_wmi_bios_setup(struct platform_device *device);>  static int __exit hp_wmi_bios_remove(struct platform_device *device);>  static int hp_wmi_resume_handler(struct platform_device *device);> @@ -170,8 +176,8 @@ static int hp_wmi_tablet_state(void)>>  static int hp_wmi_set_block(void *data, bool blocked)>  {> -       unsigned long b = (unsigned long) data;> -       int query = BIT(b + 8) | ((!blocked) << b);> +       enum hp_wmi_radio r = (enum hp_wmi_radio) data;> +       int query = BIT(r + 8) | ((!blocked) << r);>>        return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, query);>  }> @@ -180,41 +186,23 @@ static const struct rfkill_ops hp_wmi_rfkill_ops = {>        .set_block = hp_wmi_set_block,>  };>> -static bool hp_wmi_wifi_sw_state(void)> +static bool hp_wmi_get_sw_state(enum hp_wmi_radio r)>  {>        int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);> +       int mask = 0x200 << (r * 8);>> -       if (wireless & 0x200)> +       if (wireless & mask)>                return false;>        else>                return true;>  }>> -static bool hp_wmi_wifi_hw_state(void)> +static bool hp_wmi_get_hw_state(enum hp_wmi_radio r)>  {>        int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);> +       int mask = 0x800 << (r * 8);>> -       if (wireless & 0x800)> -               return false;> -       else> -               return true;> -}> -> -static bool hp_wmi_bluetooth_state(void)> -{> -       int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);> -> -       if (wireless & 0x10000)> -               return false;> -       else> -               return true;> -}> -> -static bool hp_wmi_wwan_state(void)> -{> -       int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);> -> -       if (wireless & 0x1000000)> +       if (wireless & mask)>                return false;>        else>                return true;> @@ -339,50 +327,55 @@ static void hp_wmi_notify(u32 value, void *context)>        struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };>        static struct key_entry *key;>        union acpi_object *obj;> +       int eventcode;>>        wmi_get_event_data(value, &response);>>        obj = (union acpi_object *)response.pointer;>> -       if (obj && obj->type == ACPI_TYPE_BUFFER && obj->buffer.length == 8) {> -               int eventcode = *((u8 *) obj->buffer.pointer);> -               if (eventcode == 0x4)> -                       eventcode = hp_wmi_perform_query(HPWMI_HOTKEY_QUERY, 0,> -                                                        0);> -               key = hp_wmi_get_entry_by_scancode(eventcode);> -               if (key) {> -                       switch (key->type) {> -                       case KE_KEY:> -                               input_report_key(hp_wmi_input_dev,> -                                                key->keycode, 1);> -                               input_sync(hp_wmi_input_dev);> -                               input_report_key(hp_wmi_input_dev,> -                                                key->keycode, 0);> -                               input_sync(hp_wmi_input_dev);> -                               break;> -                       }> -               } else if (eventcode == 0x1) {> -                       input_report_switch(hp_wmi_input_dev, SW_DOCK,> -                                           hp_wmi_dock_state());> -                       input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,> -                                           hp_wmi_tablet_state());> +       if (!obj || obj->type != ACPI_TYPE_BUFFER || obj->buffer.length != 8) {> +               printk(KERN_INFO "HP WMI: Unknown response received\n");> +               return;> +       }> +> +       eventcode = *((u8 *) obj->buffer.pointer);> +       if (eventcode == 0x4)> +               eventcode = hp_wmi_perform_query(HPWMI_HOTKEY_QUERY, 0,> +                                               0);> +       key = hp_wmi_get_entry_by_scancode(eventcode);> +       if (key) {> +               switch (key->type) {> +               case KE_KEY:> +                       input_report_key(hp_wmi_input_dev,> +                                        key->keycode, 1);> +                       input_sync(hp_wmi_input_dev);> +                       input_report_key(hp_wmi_input_dev,> +                                        key->keycode, 0);>                        input_sync(hp_wmi_input_dev);> -               } else if (eventcode == 0x5) {> -                       if (wifi_rfkill)> -                               rfkill_set_states(wifi_rfkill,> -                                                 hp_wmi_wifi_sw_state(),> -                                                 hp_wmi_wifi_hw_state());> -                       if (bluetooth_rfkill)> -                               rfkill_set_sw_state(bluetooth_rfkill,> -                                                   hp_wmi_bluetooth_state());> -                       if (wwan_rfkill)> -                               rfkill_set_sw_state(wwan_rfkill,> -                                                   hp_wmi_wwan_state());> -               } else> -                       printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n",> -                              eventcode);> +                       break;> +               }> +       } else if (eventcode == 0x1) {> +               input_report_switch(hp_wmi_input_dev, SW_DOCK,> +                                   hp_wmi_dock_state());> +               input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,> +                                   hp_wmi_tablet_state());> +               input_sync(hp_wmi_input_dev);> +       } else if (eventcode == 0x5) {> +               if (wifi_rfkill)> +                       rfkill_set_states(wifi_rfkill,> +                                         hp_wmi_get_sw_state(HPWMI_WIFI),> +                                         hp_wmi_get_hw_state(HPWMI_WIFI));> +               if (bluetooth_rfkill)> +                       rfkill_set_states(bluetooth_rfkill,> +                                         hp_wmi_get_sw_state(HPWMI_BLUETOOTH),> +                                         hp_wmi_get_hw_state(HPWMI_BLUETOOTH));> +               if (wwan_rfkill)> +                       rfkill_set_states(wwan_rfkill,> +                                         hp_wmi_get_sw_state(HPWMI_WWAN),> +                                         hp_wmi_get_hw_state(HPWMI_WWAN));>        } else> -               printk(KERN_INFO "HP WMI: Unknown response received\n");> +               printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n",> +                       eventcode);>  }>>  static int __init hp_wmi_input_setup(void)> @@ -461,11 +454,11 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)>                wifi_rfkill = rfkill_alloc("hp-wifi", &device->dev,>                                           RFKILL_TYPE_WLAN,>                                           &hp_wmi_rfkill_ops,> -                                          (void *) 0);> +                                          (void *) HPWMI_WIFI);>                rfkill_init_sw_state(wifi_rfkill,> -                                    hp_wmi_wifi_sw_state());> +                                    hp_wmi_get_sw_state(HPWMI_WIFI));>                rfkill_set_hw_state(wifi_rfkill,> -                                   hp_wmi_wifi_hw_state());> +                                   hp_wmi_get_hw_state(HPWMI_WIFI));>                err = rfkill_register(wifi_rfkill);>                if (err)>                        goto register_wifi_error;> @@ -475,7 +468,11 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)>                bluetooth_rfkill = rfkill_alloc("hp-bluetooth", &device->dev,>                                                RFKILL_TYPE_BLUETOOTH,>                                                &hp_wmi_rfkill_ops,> -                                               (void *) 1);> +                                               (void *) HPWMI_BLUETOOTH);> +               rfkill_init_sw_state(bluetooth_rfkill,> +                                    hp_wmi_get_sw_state(HPWMI_BLUETOOTH));> +               rfkill_set_hw_state(bluetooth_rfkill,> +                                   hp_wmi_get_hw_state(HPWMI_BLUETOOTH));>                err = rfkill_register(bluetooth_rfkill);>                if (err)>                        goto register_bluetooth_error;> @@ -485,7 +482,11 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)>                wwan_rfkill = rfkill_alloc("hp-wwan", &device->dev,>                                           RFKILL_TYPE_WWAN,>                                           &hp_wmi_rfkill_ops,> -                                          (void *) 2);> +                                          (void *) HPWMI_WWAN);> +               rfkill_init_sw_state(wwan_rfkill,> +                                    hp_wmi_get_sw_state(HPWMI_WWAN));> +               rfkill_set_hw_state(wwan_rfkill,> +                                   hp_wmi_get_hw_state(HPWMI_WWAN));>                err = rfkill_register(wwan_rfkill);>                if (err)>                        goto register_wwan_err;> @@ -541,9 +542,18 @@ static int hp_wmi_resume_handler(struct platform_device *device)>                            hp_wmi_tablet_state());>        input_sync(hp_wmi_input_dev);>> -       rfkill_set_states(wifi_rfkill,> -                         hp_wmi_wifi_sw_state(),> -                         hp_wmi_wifi_hw_state());> +       if (wifi_rfkill)> +               rfkill_set_states(wifi_rfkill,> +                                 hp_wmi_get_sw_state(HPWMI_WIFI),> +                                 hp_wmi_get_hw_state(HPWMI_WIFI));> +       if (bluetooth_rfkill)> +               rfkill_set_states(bluetooth_rfkill,> +                                 hp_wmi_get_sw_state(HPWMI_BLUETOOTH),> +                                 hp_wmi_get_hw_state(HPWMI_BLUETOOTH));> +       if (wwan_rfkill)> +               rfkill_set_states(wwan_rfkill,> +                                 hp_wmi_get_sw_state(HPWMI_WWAN),> +                                 hp_wmi_get_hw_state(HPWMI_WWAN));>>        return 0;>  }>>>
root@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill list0: phy0: Wireless LAN        Soft blocked: yes        Hard blocked: yes1: hp-wifi: Wireless LAN        Soft blocked: yes        Hard blocked: no2: hp-bluetooth: Bluetooth        Soft blocked: yes        Hard blocked: noroot@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill unblock 0root@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill list0: phy0: Wireless LAN        Soft blocked: no        Hard blocked: yes1: hp-wifi: Wireless LAN        Soft blocked: yes        Hard blocked: no2: hp-bluetooth: Bluetooth        Soft blocked: yes        Hard blocked: noroot@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill unblock 1root@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill list0: phy0: Wireless LAN        Soft blocked: no        Hard blocked: no1: hp-wifi: Wireless LAN        Soft blocked: no        Hard blocked: no2: hp-bluetooth: Bluetooth        Soft blocked: yes        Hard blocked: noroot@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill unblock 2root@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill list0: phy0: Wireless LAN        Soft blocked: no        Hard blocked: no1: hp-wifi: Wireless LAN        Soft blocked: no        Hard blocked: no2: hp-bluetooth: Bluetooth        Soft blocked: no        Hard blocked: no3: hci0: Bluetooth        Soft blocked: yes        Hard blocked: noroot@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill unblock 3root@gumis:/home/maciek/zrodelka/rfkill/rfkill# ./rfkill list0: phy0: Wireless LAN        Soft blocked: no        Hard blocked: no1: hp-wifi: Wireless LAN        Soft blocked: no        Hard blocked: no2: hp-bluetooth: Bluetooth        Soft blocked: no        Hard blocked: no3: hci0: Bluetooth        Soft blocked: no        Hard blocked: noroot@gumis:/home/maciek/zrodelka/rfkill/rfkill# hciconfighci0:   Type: USB        BD Address: 00:16:41:88:A0:1B ACL MTU: 1017:8 SCO MTU: 64:8        DOWN        RX bytes:318 acl:0 sco:0 events:6 errors:0        TX bytes:27 acl:0 sco:0 commands:9 errors:0
Works OK. Thanks :-)
During compile I have got:CC [M]  drivers/platform/x86/hp-wmi.odrivers/platform/x86/hp-wmi.c: In function ‘hp_wmi_bios_setup’:drivers/platform/x86/hp-wmi.c:460: warning: ignoring return value of‘rfkill_set_hw_state’, declared with attribute warn_unused_resultdrivers/platform/x86/hp-wmi.c:474: warning: ignoring return value of‘rfkill_set_hw_state’, declared with attribute warn_unused_resultdrivers/platform/x86/hp-wmi.c:488: warning: ignoring return value of‘rfkill_set_hw_state’, declared with attribute warn_unused_result
root@gumis:/home/maciek# gcc -vUsing built-in specs.Target: i486-linux-gnuConfigured with: ../src/configure -v --with-pkgversion='Debian4.3.3-13' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr--enable-shared --enable-multiarch --with-system-zlib--libexecdir=/usr/lib --without-included-gettext--enable-threads=posix --enable-nls--with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc--enable-mpfr --enable-targets=all --with-tune=generic--enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu--target=i486-linux-gnuThread model: posixgcc version 4.3.3 (Debian 4.3.3-13)
Regards-- Maciej Ruteckihttp://www.maciek.unixy.pl��.n��������+%����;��w��{.n�����{�����ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux