Date: Wed, 23 Jun 2004 20:00:23 -0000 From: "Liam J. Foy" <liamfoy@sepulcrum.org> To: Nate Lawson <nate@root.org> Cc: acpi@freebsd.org Subject: Re: apm problem Message-ID: <20000623205805.4c299e4e.liamfoy@sepulcrum.org> In-Reply-To: <20040623123827.O86825@root.org> References: <20040616171408.0f88c928.liamfoy@sepulcrum.org> <20040616.135044.85075412.imp@bsdimp.com> <20040623123827.O86825@root.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 23 Jun 2004 12:40:40 -0700 (PDT) Nate Lawson <nate@root.org> wrote: > On Wed, 16 Jun 2004, M. Warner Losh wrote: > > As it relates to acpi, however, there is one bug. First in > > acpi_capm_get_info(), if we can't get the battery info, we do: > > > > if (acpi_battery_get_battinfo(-1, &batt)) { > > aip->ai_batt_stat = 0xff; /* unknown */ > > aip->ai_batt_life = 0xff; /* unknown */ > > aip->ai_batt_time = -1; /* unknown */ > > - aip->ai_batteries = 0; > > } else { > > > > instead, this should be: > > if (acpi_battery_get_battinfo(-1, &batt)) { > > aip->ai_batt_stat = 0xff; /* unknown */ > > aip->ai_batt_life = 0xff; /* unknown */ > > aip->ai_batt_time = -1; /* unknown */ > > + aip->ai_batteries = -1; /* Unknown */ [*] > > } else { > > > > [*] or 0xffffffff instead of -1. 0 is clearly wrong, since it means > > no batteries, not the number of batteries cannot be determined. > > I agree with this. I'd like to use ~0 instead of (u_int)-1. Up to you > though. Please commit. > > > Finally, apm(8) needs the following patch, imho. If drivers are > > producing results that produce bad things, they should be fixed, not > > apm(8). I don't think that anything does actually produce them. > > > > Index: apm.c > > =================================================================== > > RCS file: /cache/ncvs/src/usr.sbin/apm/apm.c,v > > retrieving revision 1.32 > > diff -u -r1.32 apm.c > > --- apm.c 27 May 2004 19:23:27 -0000 1.32 > > +++ apm.c 16 Jun 2004 19:45:52 -0000 > > @@ -34,6 +34,8 @@ > > > > #define APMDEV "/dev/apm" > > > > +#define APM_UNKNOWN 0xff /* Unknown in APM BIOS spec */ > > + > > #define xh(a) (((a) & 0xff00) >> 8) > > #define xl(a) ((a) & 0xff) > > #define APMERR(a) xh(a) > > @@ -156,7 +158,7 @@ > > printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor); > > printf("APM Management: %s\n", aip->ai_status ? "Enabled" : "Disabled"); > > printf("AC Line status: "); > > - if (aip->ai_acline >= 255) > > + if (aip->ai_acline == APM_UNKNOWN) > > printf("unknown"); > > else if (aip->ai_acline > 1) > > printf("invalid value (0x%x)", aip->ai_acline); > > @@ -164,7 +166,7 @@ > > printf("%s", line_msg[aip->ai_acline]); > > printf("\n"); > > printf("Battery status: "); > > - if (aip->ai_batt_stat >= 255) > > + if (aip->ai_batt_stat == APM_UNKNOWN) > > printf("unknown"); > > else if (aip->ai_batt_stat > 3) > > printf("invalid value (0x%x)", aip->ai_batt_stat); > > @@ -172,7 +174,7 @@ > > printf("%s", batt_msg[aip->ai_batt_stat]); > > printf("\n"); > > printf("Remaining battery life: "); > > - if (aip->ai_batt_life >= 255) > > + if (aip->ai_batt_life == APM_UNKNOWN) > > printf("unknown\n"); > > else if (aip->ai_batt_life <= 100) > > printf("%d%%\n", aip->ai_batt_life); > > @@ -194,7 +196,7 @@ > > } > > if (aip->ai_infoversion >= 1) { > > printf("Number of batteries: "); > > - if (aip->ai_batteries >= 255) > > + if (aip->ai_batteries == (u_int) -1) > > printf("unknown\n"); > > else { > > u_int i; > > @@ -208,12 +210,12 @@ > > continue; > > printf("Battery %d:\n", i); > > printf("\tBattery status: "); > > - if (aps.ap_batt_flag <= 255 && > > + if (aps.ap_batt_flag != APM_UNKNOWN && > > (aps.ap_batt_flag & APM_BATT_NOT_PRESENT)) { > > printf("not present\n"); > > continue; > > } > > - if (aps.ap_batt_stat >= 255) > > + if (aps.ap_batt_stat != APM_UNKNOWN) > > printf("unknown\n"); > > else if (aps.ap_batt_stat > 3) > > printf("invalid value (0x%x)\n", > > @@ -222,7 +224,7 @@ > > printf("%s\n", > > batt_msg[aps.ap_batt_stat]); > > printf("\tRemaining battery life: "); > > - if (aps.ap_batt_life >= 255) > > + if (aps.ap_batt_life == (u_int)-1) > > printf("unknown\n"); > > else if (aps.ap_batt_life <= 100) > > printf("%d%%\n", aps.ap_batt_life); > > Please commit this patch after deciding whether you want to go with ~0 or > (u_int)-1. We decided to go with -1. The apm.c patch currently will not apply due to the re-structure of apm. The following patch will: http://liamfoy.kerneled.org/apm.diff After more digging, apm -l should return 255(stated in man page and acpi spec). The following patch will make it work: --- /usr/src/sys/dev/acpica/acpi_cmbat.c Tue Jun 22 16:40:35 2004 +++ /hd2/acpi_cmbat.c Tue Jun 22 17:02:18 2004 @@ -449,7 +449,7 @@ static int bat_units = 0; static struct acpi_cmbat_softc **bat = NULL; - cap = min = -1; + cap = min = 255; batt_stat = ACPI_BATT_STAT_NOT_PRESENT; error = 0; @@ -545,7 +545,7 @@ /* Battery life */ if (valid_units == 0) { - cap = -1; + cap = 255; batt_stat = ACPI_BATT_STAT_NOT_PRESENT; } else { cap = total_cap / valid_units; @@ -649,7 +649,7 @@ } if (!sc->present) { - battinfo->cap = -1; + battinfo->cap = 255; battinfo->min = -1; battinfo->state = ACPI_BATT_STAT_NOT_PRESENT; } else { I think all the patches need commiting. > > -Nate > _______________________________________________ > freebsd-acpi@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-acpi > To unsubscribe, send any mail to "freebsd-acpi-unsubscribe@freebsd.org" -- -Liam J. Foy http://liamfoy.kerneled.org "Now I wish it would rain down on me"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000623205805.4c299e4e.liamfoy>