acpi: Fix setting sleep state sysctls to NONE

This restores the functionality as it was pre-97d152698f48.

A stopgap was committed by glebius@ in 34dfccc64f ("acpi: in
acpi_stype_sysctl() use same logic as in acpi_sleep_state_sysctl()").

PR:		290651
Reviewed by:	thj, emaste
Approved by:	thj
Fixes:	97d152698f ("acpi: Use sleep types defined in sys/power.h")
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D53909
This commit is contained in:
Aymeric Wibo
2025-11-25 11:34:34 -08:00
parent e5d50a679a
commit eeaa865edb
+24 -15
View File
@@ -4318,13 +4318,15 @@ acpi_sname_to_sstate(const char *sname)
{
int sstate;
if (strcasecmp(sname, "NONE") == 0)
return (ACPI_STATE_UNKNOWN);
if (toupper(sname[0]) == 'S') {
sstate = sname[1] - '0';
if (sstate >= ACPI_STATE_S0 && sstate <= ACPI_STATE_S5 &&
sname[2] == '\0')
return (sstate);
} else if (strcasecmp(sname, "NONE") == 0)
return (ACPI_STATE_UNKNOWN);
}
return (-1);
}
@@ -4379,8 +4381,10 @@ acpi_suspend_state_sysctl(SYSCTL_HANDLER_ARGS)
if (new_sstate < 0)
return (EINVAL);
new_stype = acpi_sstate_to_stype(new_sstate);
if (acpi_supported_stypes[new_stype] == false)
if (new_sstate != ACPI_STATE_UNKNOWN &&
acpi_supported_stypes[new_stype] == false)
return (EOPNOTSUPP);
if (new_stype != old_stype)
power_suspend_stype = new_stype;
return (err);
@@ -4423,21 +4427,26 @@ acpi_stype_sysctl(SYSCTL_HANDLER_ARGS)
if (err != 0 || req->newptr == NULL)
return (err);
new_stype = power_name_to_stype(name);
if (new_stype == POWER_STYPE_UNKNOWN) {
sstate = acpi_sname_to_sstate(name);
if (sstate < 0)
return (EINVAL);
printf("warning: this sysctl expects a sleep type, but an ACPI S-state has "
"been passed to it. This functionality is deprecated; see acpi(4).\n");
if (sstate < ACPI_S_STATE_COUNT &&
!acpi_supported_sstates[sstate])
if (strcasecmp(name, "NONE") == 0) {
new_stype = POWER_STYPE_UNKNOWN;
} else {
new_stype = power_name_to_stype(name);
if (new_stype == POWER_STYPE_UNKNOWN) {
sstate = acpi_sname_to_sstate(name);
if (sstate < 0)
return (EINVAL);
printf("warning: this sysctl expects a sleep type, but an ACPI "
"S-state has been passed to it. This functionality is "
"deprecated; see acpi(4).\n");
MPASS(sstate < ACPI_S_STATE_COUNT);
if (acpi_supported_sstates[sstate] == false)
return (EOPNOTSUPP);
new_stype = acpi_sstate_to_stype(sstate);
}
if (acpi_supported_stypes[new_stype] == false)
return (EOPNOTSUPP);
new_stype = acpi_sstate_to_stype(sstate);
}
if (acpi_supported_stypes[new_stype] == false)
return (EOPNOTSUPP);
if (new_stype != old_stype)
*(enum power_stype *)oidp->oid_arg1 = new_stype;
return (0);