diff options
author | Andy Lutomirski <luto@kernel.org> | 2017-08-01 11:37:26 -0400 |
---|---|---|
committer | Darren Hart (VMware) <dvhart@infradead.org> | 2017-08-01 18:41:43 -0400 |
commit | 51391caf99e34d2d75ffc428845062d93aa739c6 (patch) | |
tree | 79fc403fb880e3c3989788e3c28046eaafb7e12d | |
parent | 972777171f33f9932f51feebe42dbcc1b475d01a (diff) |
platform/x86: dell-wmi: Fix driver interface version query
When I converted dell-wmi to the new bus infrastructure, I left the
call to dell_wmi_check_descriptor_buffer() in dell_wmi_init(). This
could cause two problems:
- An error message when loading the driver on a system without
dell-wmi. We'd try to read the event descriptor even if the WMI
GUID wasn't there.
- A possible race if dell-wmi was loaded manually before wmi was
fully initialized.
Fix it by moving the call to the probe function where it belongs.
Fixes: bff589be59c5 ("platform/x86: dell-wmi: Convert to the WMI bus infrastructure")
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
-rw-r--r-- | drivers/platform/x86/dell-wmi.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c index f8978464df31..dad8f4afa17c 100644 --- a/drivers/platform/x86/dell-wmi.c +++ b/drivers/platform/x86/dell-wmi.c | |||
@@ -626,7 +626,7 @@ static void dell_wmi_input_destroy(struct wmi_device *wdev) | |||
626 | * WMI Interface Version 8 4 <version> | 626 | * WMI Interface Version 8 4 <version> |
627 | * WMI buffer length 12 4 4096 | 627 | * WMI buffer length 12 4 4096 |
628 | */ | 628 | */ |
629 | static int __init dell_wmi_check_descriptor_buffer(void) | 629 | static int dell_wmi_check_descriptor_buffer(void) |
630 | { | 630 | { |
631 | struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL }; | 631 | struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL }; |
632 | union acpi_object *obj; | 632 | union acpi_object *obj; |
@@ -717,9 +717,15 @@ static int dell_wmi_events_set_enabled(bool enable) | |||
717 | 717 | ||
718 | static int dell_wmi_probe(struct wmi_device *wdev) | 718 | static int dell_wmi_probe(struct wmi_device *wdev) |
719 | { | 719 | { |
720 | int err; | ||
721 | |||
720 | struct dell_wmi_priv *priv = devm_kzalloc( | 722 | struct dell_wmi_priv *priv = devm_kzalloc( |
721 | &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); | 723 | &wdev->dev, sizeof(struct dell_wmi_priv), GFP_KERNEL); |
722 | 724 | ||
725 | err = dell_wmi_check_descriptor_buffer(); | ||
726 | if (err) | ||
727 | return err; | ||
728 | |||
723 | dev_set_drvdata(&wdev->dev, priv); | 729 | dev_set_drvdata(&wdev->dev, priv); |
724 | 730 | ||
725 | return dell_wmi_input_setup(wdev); | 731 | return dell_wmi_input_setup(wdev); |
@@ -749,10 +755,6 @@ static int __init dell_wmi_init(void) | |||
749 | { | 755 | { |
750 | int err; | 756 | int err; |
751 | 757 | ||
752 | err = dell_wmi_check_descriptor_buffer(); | ||
753 | if (err) | ||
754 | return err; | ||
755 | |||
756 | dmi_check_system(dell_wmi_smbios_list); | 758 | dmi_check_system(dell_wmi_smbios_list); |
757 | 759 | ||
758 | if (wmi_requires_smbios_request) { | 760 | if (wmi_requires_smbios_request) { |