Skip to content

Commit

Permalink
Fix unsupported operation error handling
Browse files Browse the repository at this point in the history
This should fix issue #23.
The status function call was returning an invalid
buffer length on a system which apparantly does
not support the battery health control features.

This commit changes the driver to prevent it from
loading in this case.
  • Loading branch information
frederik-h committed Jun 12, 2023
1 parent 2e57c4a commit 4e605fb
Showing 1 changed file with 25 additions and 9 deletions.
34 changes: 25 additions & 9 deletions acer-wmi-battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ get_battery_health_control_status(struct battery_info *bat_status)
ret = *((struct get_battery_health_control_status_output *)
obj->buffer.pointer);
if (obj->buffer.length != 8) {
pr_warn("Unknown buffer length %d\n", obj->buffer.length);
pr_err("WMI battery status call returned a buffer of "
"unexpected length %d\n", obj->buffer.length);
kfree(obj);
return AE_ERROR;
}
Expand Down Expand Up @@ -159,9 +160,10 @@ static acpi_status set_battery_health_control(u8 function, bool function_status)
ret = *((struct set_battery_health_control_output *)obj->buffer.pointer);

if (obj->buffer.length != 4) {
pr_warn("Unknown buffer length %d\n", obj->buffer.length);
kfree(obj);
return AE_ERROR;
pr_err("WMI battery status set operation returned "
"a buffer of unexpected length %d\n",
obj->buffer.length);
status = AE_ERROR;
}

kfree(obj);
Expand All @@ -180,10 +182,14 @@ static void print_modes(const char *prefix, bool print_if_empty,
calib_mode ? "calibration mode" : "");
}

static void init_state(void)
static acpi_status init_state(void)
{
bool print_state_if_empty;
get_battery_health_control_status(&battery_status);
acpi_status status;
status = get_battery_health_control_status(&battery_status);

if (ACPI_FAILURE(status))
return status;

print_state_if_empty = true;
print_modes("available", print_state_if_empty,
Expand All @@ -194,6 +200,8 @@ static void init_state(void)
print_modes("active", print_state_if_empty,
battery_status.health_mode > 0,
battery_status.calibration_mode > 0);

return status;
}

static void update_state(void)
Expand Down Expand Up @@ -290,9 +298,17 @@ static int __init acer_battery_init(void)
return -ENODEV;
}

if (enable_health_mode >= 0)
set_battery_health_control(HEALTH_MODE, enable_health_mode);
init_state();
if (enable_health_mode >= 0) {
acpi_status status;
status = set_battery_health_control(HEALTH_MODE,
enable_health_mode);

if (ACPI_FAILURE(status))
return -EIO;
}

if (ACPI_FAILURE(init_state()))
return -EIO;

return wmi_driver_register(&acer_wmi_battery_driver);
}
Expand Down

0 comments on commit 4e605fb

Please sign in to comment.