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

Commit 1709adab authored by Lee, Chun-Yi's avatar Lee, Chun-Yi Committed by Matthew Garrett
Browse files

acer-wmi: check wireless capability flag before register rfkill



There will be better to check the wireless capability flag
(ACER_CAP_WIRELESS) before register wireless rfkill because maybe
the machine doesn't have wifi module or the module removed by user.

Tested on Acer Travelmate 8572
Tested on Acer Aspire 4739Z

Tested-by: default avatarAceLan Kao <acelan.kao@canonical.com>
Cc: Carlos Corbacho <carlos@strangeworlds.co.uk>
Cc: Matthew Garrett <mjg@redhat.com>
Cc: Dmitry Torokhov <dtor@mail.ru>
Cc: Corentin Chary <corentincj@iksaif.net>
Cc: Thomas Renninger <trenn@suse.de>
Signed-off-by: default avatarLee, Chun-Yi <jlee@suse.com>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent 8fcf71aa
Loading
Loading
Loading
Loading
+42 −22
Original line number Original line Diff line number Diff line
@@ -1294,11 +1294,12 @@ static void acer_rfkill_update(struct work_struct *ignored)
	u32 state;
	u32 state;
	acpi_status status;
	acpi_status status;


	if (has_cap(ACER_CAP_WIRELESS)) {
		status = get_u32(&state, ACER_CAP_WIRELESS);
		status = get_u32(&state, ACER_CAP_WIRELESS);
		if (ACPI_SUCCESS(status)) {
		if (ACPI_SUCCESS(status)) {
		if (quirks->wireless == 3) {
			if (quirks->wireless == 3)
				rfkill_set_hw_state(wireless_rfkill, !state);
				rfkill_set_hw_state(wireless_rfkill, !state);
		} else {
			else
				rfkill_set_sw_state(wireless_rfkill, !state);
				rfkill_set_sw_state(wireless_rfkill, !state);
		}
		}
	}
	}
@@ -1368,19 +1369,24 @@ static struct rfkill *acer_rfkill_register(struct device *dev,


static int acer_rfkill_init(struct device *dev)
static int acer_rfkill_init(struct device *dev)
{
{
	int err;

	if (has_cap(ACER_CAP_WIRELESS)) {
		wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN,
		wireless_rfkill = acer_rfkill_register(dev, RFKILL_TYPE_WLAN,
			"acer-wireless", ACER_CAP_WIRELESS);
			"acer-wireless", ACER_CAP_WIRELESS);
	if (IS_ERR(wireless_rfkill))
		if (IS_ERR(wireless_rfkill)) {
		return PTR_ERR(wireless_rfkill);
			err = PTR_ERR(wireless_rfkill);
			goto error_wireless;
		}
	}


	if (has_cap(ACER_CAP_BLUETOOTH)) {
	if (has_cap(ACER_CAP_BLUETOOTH)) {
		bluetooth_rfkill = acer_rfkill_register(dev,
		bluetooth_rfkill = acer_rfkill_register(dev,
			RFKILL_TYPE_BLUETOOTH, "acer-bluetooth",
			RFKILL_TYPE_BLUETOOTH, "acer-bluetooth",
			ACER_CAP_BLUETOOTH);
			ACER_CAP_BLUETOOTH);
		if (IS_ERR(bluetooth_rfkill)) {
		if (IS_ERR(bluetooth_rfkill)) {
			rfkill_unregister(wireless_rfkill);
			err = PTR_ERR(bluetooth_rfkill);
			rfkill_destroy(wireless_rfkill);
			goto error_bluetooth;
			return PTR_ERR(bluetooth_rfkill);
		}
		}
	}
	}


@@ -1389,30 +1395,44 @@ static int acer_rfkill_init(struct device *dev)
			RFKILL_TYPE_WWAN, "acer-threeg",
			RFKILL_TYPE_WWAN, "acer-threeg",
			ACER_CAP_THREEG);
			ACER_CAP_THREEG);
		if (IS_ERR(threeg_rfkill)) {
		if (IS_ERR(threeg_rfkill)) {
			rfkill_unregister(wireless_rfkill);
			err = PTR_ERR(threeg_rfkill);
			rfkill_destroy(wireless_rfkill);
			goto error_threeg;
			rfkill_unregister(bluetooth_rfkill);
			rfkill_destroy(bluetooth_rfkill);
			return PTR_ERR(threeg_rfkill);
		}
		}
	}
	}


	rfkill_inited = true;
	rfkill_inited = true;


	if (ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID))
	if ((ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID)) &&
	    has_cap(ACER_CAP_WIRELESS | ACER_CAP_BLUETOOTH | ACER_CAP_THREEG))
		schedule_delayed_work(&acer_rfkill_work,
		schedule_delayed_work(&acer_rfkill_work,
			round_jiffies_relative(HZ));
			round_jiffies_relative(HZ));


	return 0;
	return 0;

error_threeg:
	if (has_cap(ACER_CAP_BLUETOOTH)) {
		rfkill_unregister(bluetooth_rfkill);
		rfkill_destroy(bluetooth_rfkill);
	}
error_bluetooth:
	if (has_cap(ACER_CAP_WIRELESS)) {
		rfkill_unregister(wireless_rfkill);
		rfkill_destroy(wireless_rfkill);
	}
error_wireless:
	return err;
}
}


static void acer_rfkill_exit(void)
static void acer_rfkill_exit(void)
{
{
	if (ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID))
	if ((ec_raw_mode || !wmi_has_guid(ACERWMID_EVENT_GUID)) &&
	    has_cap(ACER_CAP_WIRELESS | ACER_CAP_BLUETOOTH | ACER_CAP_THREEG))
		cancel_delayed_work_sync(&acer_rfkill_work);
		cancel_delayed_work_sync(&acer_rfkill_work);


	if (has_cap(ACER_CAP_WIRELESS)) {
		rfkill_unregister(wireless_rfkill);
		rfkill_unregister(wireless_rfkill);
		rfkill_destroy(wireless_rfkill);
		rfkill_destroy(wireless_rfkill);
	}


	if (has_cap(ACER_CAP_BLUETOOTH)) {
	if (has_cap(ACER_CAP_BLUETOOTH)) {
		rfkill_unregister(bluetooth_rfkill);
		rfkill_unregister(bluetooth_rfkill);