Author: avg
Date: Fri Mar 11 17:12:39 2011
New Revision: 219510
URL: http://svn.freebsd.org/changeset/base/219510

Log:
  MFC r216503: small cleanup of acpi battery status setting and checking
  
  PR:           kern/124744

Modified:
  stable/7/sys/dev/acpica/acpi_battery.c
  stable/7/sys/dev/acpica/acpi_cmbat.c
  stable/7/sys/dev/acpica/acpi_smbat.c
  stable/7/sys/dev/acpica/acpiio.h
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/dev/acpica/acpi_battery.c
==============================================================================
--- stable/7/sys/dev/acpica/acpi_battery.c      Fri Mar 11 17:01:14 2011        
(r219509)
+++ stable/7/sys/dev/acpica/acpi_battery.c      Fri Mar 11 17:12:39 2011        
(r219510)
@@ -101,8 +101,9 @@ acpi_battery_get_info_expire(void)
 int
 acpi_battery_bst_valid(struct acpi_bst *bst)
 {
-    return (bst->state < ACPI_BATT_STAT_MAX && bst->cap != ACPI_BATT_UNKNOWN &&
-       bst->volt != ACPI_BATT_UNKNOWN);
+
+    return (bst->state != ACPI_BATT_STAT_NOT_PRESENT &&
+       bst->cap != ACPI_BATT_UNKNOWN && bst->volt != ACPI_BATT_UNKNOWN);
 }
 
 /* Check _BIF results for validity. */

Modified: stable/7/sys/dev/acpica/acpi_cmbat.c
==============================================================================
--- stable/7/sys/dev/acpica/acpi_cmbat.c        Fri Mar 11 17:01:14 2011        
(r219509)
+++ stable/7/sys/dev/acpica/acpi_cmbat.c        Fri Mar 11 17:12:39 2011        
(r219510)
@@ -278,6 +278,12 @@ acpi_cmbat_get_bst(void *arg)
        goto end;
     acpi_cmbat_info_updated(&sc->bst_lastupdated);
 
+    /* Clear out undefined/extended bits that might be set by hardware. */
+    sc->bst.state &= ACPI_BATT_STAT_BST_MASK;
+    if ((sc->bst.state & ACPI_BATT_STAT_INVALID) == ACPI_BATT_STAT_INVALID)
+       ACPI_VPRINT(dev, acpi_device_get_parent_softc(dev),
+           "battery reports simultaneous charging and discharging\n");
+
     /* XXX If all batteries are critical, perhaps we should suspend. */
     if (sc->bst.state & ACPI_BATT_STAT_CRITICAL) {
        if ((sc->flags & ACPI_BATT_STAT_CRITICAL) == 0) {

Modified: stable/7/sys/dev/acpica/acpi_smbat.c
==============================================================================
--- stable/7/sys/dev/acpica/acpi_smbat.c        Fri Mar 11 17:01:14 2011        
(r219509)
+++ stable/7/sys/dev/acpica/acpi_smbat.c        Fri Mar 11 17:12:39 2011        
(r219510)
@@ -389,6 +389,7 @@ acpi_smbat_get_bst(device_t dev, struct 
 
        if (val > 0) {
                sc->bst.rate = val * factor;
+               sc->bst.state &= ~SMBATT_BS_DISCHARGING;
                sc->bst.state |= ACPI_BATT_STAT_CHARGING;
        } else if (val < 0)
                sc->bst.rate = (-val) * factor;

Modified: stable/7/sys/dev/acpica/acpiio.h
==============================================================================
--- stable/7/sys/dev/acpica/acpiio.h    Fri Mar 11 17:01:14 2011        
(r219509)
+++ stable/7/sys/dev/acpica/acpiio.h    Fri Mar 11 17:12:39 2011        
(r219510)
@@ -74,11 +74,22 @@ struct acpi_bst {
     uint32_t volt;                     /* Present Voltage */
 };
 
+/*
+ * Note that the following definitions represent status bits for internal
+ * driver state.  The first three of them (charging, discharging and critical)
+ * conveninetly conform to ACPI specification of status returned by _BST
+ * method.  Other definitions (not present, etc) are synthetic.
+ * Also note that according to the specification the charging and discharging
+ * status bits must not be set at the same time.
+ */
 #define ACPI_BATT_STAT_DISCHARG                0x0001
 #define ACPI_BATT_STAT_CHARGING                0x0002
 #define ACPI_BATT_STAT_CRITICAL                0x0004
-#define ACPI_BATT_STAT_NOT_PRESENT     0x0007
-#define ACPI_BATT_STAT_MAX             0x0007
+#define ACPI_BATT_STAT_INVALID                                 \
+    (ACPI_BATT_STAT_DISCHARG | ACPI_BATT_STAT_CHARGING)
+#define ACPI_BATT_STAT_BST_MASK                                        \
+    (ACPI_BATT_STAT_INVALID | ACPI_BATT_STAT_CRITICAL)
+#define ACPI_BATT_STAT_NOT_PRESENT     ACPI_BATT_STAT_BST_MASK
 
 union acpi_battery_ioctl_arg {
     int                         unit;  /* Device unit or 
ACPI_BATTERY_ALL_UNITS. */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to