static int msi_wmi_query_block(int instance, int *ret) { acpi_status status; union acpi_object *obj; struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; status = wmi_query_block(MSIWMI_BIOS_GUID, instance, &output); obj = output.pointer; if (!obj || obj->type != ACPI_TYPE_INTEGER) { if (obj) { printk(KERN_ERR DRV_PFX "query block returned object " "type: %d - buffer length:%d\n", obj->type, obj->type == ACPI_TYPE_BUFFER ? obj->buffer.length : 0); } kfree(obj); return -EINVAL; } *ret = obj->integer.value; kfree(obj); return 0; }
static int thinkpad_wmi_bios_setting(int item, char **value) { struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; acpi_status status; status = wmi_query_block(LENOVO_BIOS_SETTING_GUID, item, &output); if (ACPI_FAILURE(status)) return -EIO; return thinkpad_wmi_extract_output_string(&output, value); }
static int get_state(u32 *out, u8 instance) { u32 tmp; acpi_status status; struct acpi_buffer result = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; if (!out) return -EINVAL; if (instance > 2) return -ENODEV; status = wmi_query_block(GUID, instance, &result); if (ACPI_FAILURE(status)) return -ENODEV; obj = (union acpi_object *) result.pointer; if (obj && obj->type == ACPI_TYPE_INTEGER) { tmp = obj->integer.value; } else { tmp = 0; } if (result.length > 0 && result.pointer) kfree(result.pointer); switch (instance) { case TC1100_INSTANCE_WIRELESS: *out = (tmp == 3) ? 1 : 0; return 0; case TC1100_INSTANCE_JOGDIAL: *out = (tmp == 1) ? 0 : 1; return 0; default: return -ENODEV; } }
static int thinkpad_wmi_password_settings(struct thinkpad_wmi_pcfg *pcfg) { struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; const union acpi_object *obj; acpi_status status; status = wmi_query_block(LENOVO_BIOS_PASSWORD_SETTINGS_GUID, 0, &output); if (ACPI_FAILURE(status)) return -EIO; obj = output.pointer; if (!obj || obj->type != ACPI_TYPE_BUFFER || !obj->buffer.pointer) return -EIO; if (obj->buffer.length != sizeof(*pcfg)) { pr_warn("Unknown pcfg buffer length %d\n", obj->buffer.length); kfree(obj); return -EIO; } memcpy(pcfg, obj->buffer.pointer, obj->buffer.length); kfree(obj); return 0; }