acpi: Fix setting sleep state sysctls to NONE
This restores the functionality as it was pre-97d152698f48. A stopgap was committed by glebius@ in34dfccc64f("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:
+24
-15
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user