|
@@ -101,6 +101,7 @@ MODULE_LICENSE("GPL");
|
|
|
#define ASUS_WMI_DEVID_WIRELESS_LED 0x00010002
|
|
|
#define ASUS_WMI_DEVID_CWAP 0x00010003
|
|
|
#define ASUS_WMI_DEVID_WLAN 0x00010011
|
|
|
+#define ASUS_WMI_DEVID_WLAN_LED 0x00010012
|
|
|
#define ASUS_WMI_DEVID_BLUETOOTH 0x00010013
|
|
|
#define ASUS_WMI_DEVID_GPS 0x00010015
|
|
|
#define ASUS_WMI_DEVID_WIMAX 0x00010017
|
|
@@ -731,8 +732,21 @@ static int asus_rfkill_set(void *data, bool blocked)
|
|
|
{
|
|
|
struct asus_rfkill *priv = data;
|
|
|
u32 ctrl_param = !blocked;
|
|
|
+ u32 dev_id = priv->dev_id;
|
|
|
|
|
|
- return asus_wmi_set_devstate(priv->dev_id, ctrl_param, NULL);
|
|
|
+ /*
|
|
|
+ * If the user bit is set, BIOS can't set and record the wlan status,
|
|
|
+ * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
|
|
|
+ * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
|
|
|
+ * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
|
|
|
+ * while setting the wlan status through WMI.
|
|
|
+ * This is also the behavior that windows app will do.
|
|
|
+ */
|
|
|
+ if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
|
|
|
+ priv->asus->driver->wlan_ctrl_by_user)
|
|
|
+ dev_id = ASUS_WMI_DEVID_WLAN_LED;
|
|
|
+
|
|
|
+ return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
|
|
|
}
|
|
|
|
|
|
static void asus_rfkill_query(struct rfkill *rfkill, void *data)
|
|
@@ -1653,6 +1667,7 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|
|
struct asus_wmi *asus;
|
|
|
acpi_status status;
|
|
|
int err;
|
|
|
+ u32 result;
|
|
|
|
|
|
asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
|
|
|
if (!asus)
|
|
@@ -1711,6 +1726,10 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|
|
if (err)
|
|
|
goto fail_debugfs;
|
|
|
|
|
|
+ asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
|
|
|
+ if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
|
|
|
+ asus->driver->wlan_ctrl_by_user = 1;
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
fail_debugfs:
|