On Thu, 17 Aug 2023 10:07:27 -0500
joshua stein <[email protected]> wrote:
> On Thu, 17 Aug 2023 at 16:12:07 +0900, YASUOKA Masahiko wrote:
>> Hi,
>>
>> Update the AC status when the battery notification is happened.
>> Because the AC status notification doesn't happen on some machines.
>> My vaio actually has this problem.
>>
>> Also Linux is doing the same thing
>>
>> https://github.com/torvalds/linux/blob/v6.4/drivers/acpi/ac.c#L165-L183
>>
>> ok? comments?
>
> When does acpiac_notify_triggered get reset back to 0 to run again
> on the next battery notification?
Never. acpiac_notify_triggered is to disable permanently the updating
the AC status when battery notification. Because the updating is not
needed on machines which acpiac_notify() is called normally.
I decided to have the flag to stop the updating to prevent unknown
side effects. But it might be unnecessary.
>> Index: sys/dev/acpi/acpiac.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/acpi/acpiac.c,v
>> retrieving revision 1.36
>> diff -u -p -r1.36 acpiac.c
>> --- sys/dev/acpi/acpiac.c 6 Apr 2022 18:59:27 -0000 1.36
>> +++ sys/dev/acpi/acpiac.c 17 Aug 2023 06:57:44 -0000
>> @@ -140,6 +140,8 @@ acpiac_getpsr(struct acpiac_softc *sc)
>> return (0);
>> }
>>
>> +static int acpiac_notify_triggered = 0;
>> +
>> int
>> acpiac_notify(struct aml_node *node, int notify_type, void *arg)
>> {
>> @@ -148,6 +150,8 @@ acpiac_notify(struct aml_node *node, int
>> dnprintf(10, "acpiac_notify: %.2x %s\n", notify_type,
>> DEVNAME(sc));
>>
>> + acpiac_notify_triggered = 1;
>> +
>> switch (notify_type) {
>> case 0x00:
>> case 0x01:
>> @@ -164,4 +168,22 @@ acpiac_notify(struct aml_node *node, int
>> break;
>> }
>> return (0);
>> +}
>> +
>> +void
>> +acpiac_battery_notify(void)
>> +{
>> + struct acpi_softc *sc = acpi_softc;
>> + struct acpi_ac *ac;
>> +
>> + if (acpiac_notify_triggered)
>> + return;
>> + /*
>> + * On some machines (vaio VJPK23 at least) AC status notifications
>> + * are not triggered. Update the AC status when battery notifications.
>> + */
>> + SLIST_FOREACH(ac, &sc->sc_ac, aac_link) {
>> + acpiac_refresh(ac->aac_softc);
>> + acpi_record_event(sc, APM_POWER_CHANGE);
>> + }
>> }
>> Index: sys/dev/acpi/acpibat.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/acpi/acpibat.c,v
>> retrieving revision 1.70
>> diff -u -p -r1.70 acpibat.c
>> --- sys/dev/acpi/acpibat.c 6 Apr 2022 18:59:27 -0000 1.70
>> +++ sys/dev/acpi/acpibat.c 17 Aug 2023 06:57:45 -0000
>> @@ -536,5 +536,7 @@ acpibat_notify(struct aml_node *node, in
>> acpibat_refresh(sc);
>> acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE);
>>
>> + acpiac_battery_notify();
>> +
>> return (0);
>> }
>> Index: sys/dev/acpi/acpidev.h
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/acpi/acpidev.h,v
>> retrieving revision 1.44
>> diff -u -p -r1.44 acpidev.h
>> --- sys/dev/acpi/acpidev.h 29 Jun 2018 17:39:18 -0000 1.44
>> +++ sys/dev/acpi/acpidev.h 17 Aug 2023 06:57:45 -0000
>> @@ -306,6 +306,8 @@ struct acpiac_softc {
>> struct ksensordev sc_sensdev;
>> };
>>
>> +void acpiac_battery_notify(void);
>> +
>> struct acpibat_softc {
>> struct device sc_dev;
>>
>>
>