On Wed, Jul 4, 2012 at 5:19 AM, AceLan Kao <acelan.kao@xxxxxxxxxxxxx> wrote:
> The BIOS of these machines will try to enable/disable wifi/bt in
> their own sqeuence. It won't read the enable/disable parameter
> in WMI command, but just iterates the wifi/bt's status described below
> 1st. enable wifi, enable bt
> 2nd. disable wifi, enable bt
> 3rd. enable wifi, disable bt
> 4th. disable wifi, disable bt
> That will totally mess up the rfkill status, since we will try to read
> wifi and bt's status and reset it again while booting up.
>
> To avoid this, these machines should set the wapf value to 4,
> that will let software totally control the wifi/bt's status and
> BIOS will do nothing instead of sending out the 0x88(KEY_RFKILL) event
> instead of 0x5e(wifi enable), 0x5f(wifi diable), 0x7d(bt enable), and
> 0x7e(bt disable) through WMI.
>
> With this patch[1], it will handle the KEY_RFKILL event correctly and
> will block/unblock wifi and bt together.
>
> 1. https://lkml.org/lkml/2012/5/21/75
>
> Signed-off-by: AceLan Kao <acelan.kao@xxxxxxxxxxxxx>
> ---
> drivers/platform/x86/asus-nb-wmi.c | 104 ++++++++++++++++++++++++++++++++++--
> 1 file changed, 101 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c
> index 99a30b5..57712ff 100644
> --- a/drivers/platform/x86/asus-nb-wmi.c
> +++ b/drivers/platform/x86/asus-nb-wmi.c
> @@ -26,6 +26,7 @@
> #include <linux/input.h>
> #include <linux/input/sparse-keymap.h>
> #include <linux/fb.h>
> +#include <linux/dmi.h>
>
> #include "asus-wmi.h"
>
> @@ -48,18 +49,115 @@ MODULE_ALIAS("wmi:"ASUS_NB_WMI_EVENT_GUID);
> * 1 | Hardware | Software
> * 4 | Software | Software
> */
> -static uint wapf;
> +static int wapf = -1;
> module_param(wapf, uint, 0444);
> MODULE_PARM_DESC(wapf, "WAPF value");
>
> +static struct quirk_entry *quirks;
> +
> static struct quirk_entry quirk_asus_unknown = {
> + .wapf = 0,
> +};
> +
> +static struct quirk_entry quirk_asus_x401u = {
> + .wapf = 4,
> +};
> +
> +static int dmi_matched(const struct dmi_system_id *dmi)
> +{
> + quirks = dmi->driver_data;
> + return 1;
> +}
> +
> +static struct dmi_system_id asus_quirks[] = {
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X401U",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X401U"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X401A1",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X401A1"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X501U",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X501U"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X501A1",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X501A1"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X55A",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X55A"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X55C",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X55C"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X55U",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X55U"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {
> + .callback = dmi_matched,
> + .ident = "ASUSTeK COMPUTER INC. X55VD",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "X55VD"),
> + },
> + .driver_data = &quirk_asus_x401u,
> + },
> + {},
> };
>
> static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver)
> {
> - driver->quirks = &quirk_asus_unknown;
> - driver->quirks->wapf = wapf;
> + quirks = &quirk_asus_unknown;
> + dmi_check_system(asus_quirks);
> +
> + driver->quirks = quirks;
> driver->panel_power = FB_BLANK_UNBLANK;
> +
> + /* overwrite the wapf setting if the wapf paramater is specified */
> + if (wapf != -1)
> + quirks->wapf = wapf;
> + else
> + wapf = quirks->wapf;
> }
>
> static const struct key_entry asus_nb_wmi_keymap[] = {
> --
> 1.7.9.5
>
Great .. Another dmi quirk list...
Acked-by: Corentin Chary <corentin.chary@xxxxxxxxx>
--
Corentin Chary
http://xf.iksaif.net
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]