Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92530664 authored by Seth Forshee's avatar Seth Forshee Committed by Matthew Garrett
Browse files

acer-wmi: Only update rfkill status for associated hotkey events



acer-wmi is indiscriminately using the device state from hotkey
events to update the various rfkill states. On the Aspire 1830 this
can result in a soft block on the wlan when the touchpad hotkey is
pressed, as it is reporting a non-zero device state that does not
reflect the wireless status. To fix this, only update rfkill states
when a wlan or bluetooth hotkey is pressed.

Signed-off-by: default avatarSeth Forshee <seth.forshee@canonical.com>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent 4dd1b49c
Loading
Loading
Loading
Loading
+26 −15
Original line number Diff line number Diff line
@@ -1445,6 +1445,8 @@ static void acer_wmi_notify(u32 value, void *context)
	union acpi_object *obj;
	struct event_return_value return_value;
	acpi_status status;
	u16 device_state;
	const struct key_entry *key;

	status = wmi_get_event_data(value, &response);
	if (status != AE_OK) {
@@ -1472,23 +1474,32 @@ static void acer_wmi_notify(u32 value, void *context)

	switch (return_value.function) {
	case WMID_HOTKEY_EVENT:
		if (return_value.device_state) {
			u16 device_state = return_value.device_state;
		device_state = return_value.device_state;
		pr_debug("device state: 0x%x\n", device_state);

		key = sparse_keymap_entry_from_scancode(acer_wmi_input_dev,
							return_value.key_num);
		if (!key) {
			pr_warn("Unknown key number - 0x%x\n",
				return_value.key_num);
		} else {
			switch (key->keycode) {
			case KEY_WLAN:
			case KEY_BLUETOOTH:
				if (has_cap(ACER_CAP_WIRELESS))
					rfkill_set_sw_state(wireless_rfkill,
						!(device_state & ACER_WMID3_GDS_WIRELESS));
			if (has_cap(ACER_CAP_BLUETOOTH))
				rfkill_set_sw_state(bluetooth_rfkill,
				!(device_state & ACER_WMID3_GDS_BLUETOOTH));
				if (has_cap(ACER_CAP_THREEG))
					rfkill_set_sw_state(threeg_rfkill,
						!(device_state & ACER_WMID3_GDS_THREEG));
				if (has_cap(ACER_CAP_BLUETOOTH))
					rfkill_set_sw_state(bluetooth_rfkill,
						!(device_state & ACER_WMID3_GDS_BLUETOOTH));
				break;
			}
			sparse_keymap_report_entry(acer_wmi_input_dev, key,
						   1, true);
		}
		if (!sparse_keymap_report_event(acer_wmi_input_dev,
				return_value.key_num, 1, true))
			pr_warn("Unknown key number - 0x%x\n",
				return_value.key_num);
		break;
	default:
		pr_warn("Unknown function number - %d - %d\n",