Skip to content

Commit

Permalink
platform/x86: wmi: more detailed error reporting in find_guid()
Browse files Browse the repository at this point in the history
Make `find_guid()` return an acpi_status, and make it handle NULL
pointer GUID strings; and adapt users accordingly.

Signed-off-by: Barnabás Pőcze <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Hans de Goede <[email protected]>
Signed-off-by: Hans de Goede <[email protected]>
  • Loading branch information
pobrn authored and jwrdegoede committed Sep 14, 2021
1 parent 25be44f commit b0179b8
Showing 1 changed file with 27 additions and 16 deletions.
43 changes: 27 additions & 16 deletions drivers/platform/x86/wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,22 +114,27 @@ static struct platform_driver acpi_wmi_driver = {
* GUID parsing functions
*/

static bool find_guid(const char *guid_string, struct wmi_block **out)
static acpi_status find_guid(const char *guid_string, struct wmi_block **out)
{
guid_t guid_input;
struct wmi_block *wblock;

if (!guid_string)
return AE_BAD_PARAMETER;

if (guid_parse(guid_string, &guid_input))
return false;
return AE_BAD_PARAMETER;

list_for_each_entry(wblock, &wmi_block_list, list) {
if (guid_equal(&wblock->gblock.guid, &guid_input)) {
if (out)
*out = wblock;
return true;

return AE_OK;
}
}
return false;

return AE_NOT_FOUND;
}

static const void *find_guid_context(struct wmi_block *wblock,
Expand Down Expand Up @@ -271,9 +276,12 @@ acpi_status wmi_evaluate_method(const char *guid_string, u8 instance, u32 method
const struct acpi_buffer *in, struct acpi_buffer *out)
{
struct wmi_block *wblock = NULL;
acpi_status status;

status = find_guid(guid_string, &wblock);
if (ACPI_FAILURE(status))
return status;

if (!find_guid(guid_string, &wblock))
return AE_ERROR;
return wmidev_evaluate_method(&wblock->dev, instance, method_id,
in, out);
}
Expand Down Expand Up @@ -410,12 +418,11 @@ acpi_status wmi_query_block(const char *guid_string, u8 instance,
struct acpi_buffer *out)
{
struct wmi_block *wblock;
acpi_status status;

if (!guid_string)
return AE_BAD_PARAMETER;

if (!find_guid(guid_string, &wblock))
return AE_ERROR;
status = find_guid(guid_string, &wblock);
if (ACPI_FAILURE(status))
return status;

return __query_block(wblock, instance, out);
}
Expand Down Expand Up @@ -450,12 +457,14 @@ acpi_status wmi_set_block(const char *guid_string, u8 instance,
struct acpi_object_list input;
union acpi_object params[2];
char method[WMI_ACPI_METHOD_NAME_SIZE];
acpi_status status;

if (!guid_string || !in)
if (!in)
return AE_BAD_DATA;

if (!find_guid(guid_string, &wblock))
return AE_ERROR;
status = find_guid(guid_string, &wblock);
if (ACPI_FAILURE(status))
return status;

block = &wblock->gblock;
handle = wblock->acpi_device->handle;
Expand Down Expand Up @@ -660,7 +669,7 @@ EXPORT_SYMBOL_GPL(wmi_get_event_data);
*/
bool wmi_has_guid(const char *guid_string)
{
return find_guid(guid_string, NULL);
return ACPI_SUCCESS(find_guid(guid_string, NULL));
}
EXPORT_SYMBOL_GPL(wmi_has_guid);

Expand All @@ -675,8 +684,10 @@ EXPORT_SYMBOL_GPL(wmi_has_guid);
char *wmi_get_acpi_device_uid(const char *guid_string)
{
struct wmi_block *wblock = NULL;
acpi_status status;

if (!find_guid(guid_string, &wblock))
status = find_guid(guid_string, &wblock);
if (ACPI_FAILURE(status))
return NULL;

return acpi_device_uid(wblock->acpi_device);
Expand Down

0 comments on commit b0179b8

Please sign in to comment.