Module Name:    src
Committed By:   jruoho
Date:           Wed Jul 13 09:58:53 UTC 2011

Modified Files:
        src/sys/dev/acpi: acpi_bat.c

Log Message:
In revision 1.103 the serial number was used to determine whether the
battery was changed to another one. However, this is unreliable as many
vendors hardcode the serial number string in the DSDT. Thus, use the design
capacity and voltage instead; these are likely read from the battery itself.


To generate a diff of this commit:
cvs rdiff -u -r1.110 -r1.111 src/sys/dev/acpi/acpi_bat.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/acpi/acpi_bat.c
diff -u src/sys/dev/acpi/acpi_bat.c:1.110 src/sys/dev/acpi/acpi_bat.c:1.111
--- src/sys/dev/acpi/acpi_bat.c:1.110	Mon Jun 20 20:24:59 2011
+++ src/sys/dev/acpi/acpi_bat.c	Wed Jul 13 09:58:53 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_bat.c,v 1.110 2011/06/20 20:24:59 pgoyette Exp $	*/
+/*	$NetBSD: acpi_bat.c,v 1.111 2011/07/13 09:58:53 jruoho Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.110 2011/06/20 20:24:59 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.111 2011/07/13 09:58:53 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -150,9 +150,10 @@
 	struct sysmon_envsys	*sc_sme;
 	struct timeval		 sc_last;
 	envsys_data_t		*sc_sensor;
-	char			 sc_serial[64];
 	kmutex_t		 sc_mutex;
 	kcondvar_t		 sc_condvar;
+	int32_t			 sc_dcapacity;
+	int32_t			 sc_dvoltage;
 	int32_t			 sc_lcapacity;
 	int32_t			 sc_wcapacity;
 	int                      sc_present;
@@ -231,6 +232,8 @@
 	sc->sc_node = aa->aa_node;
 
 	sc->sc_present = 0;
+	sc->sc_dvoltage = 0;
+	sc->sc_dcapacity = 0;
 	sc->sc_lcapacity = 0;
 	sc->sc_wcapacity = 0;
 
@@ -241,7 +244,6 @@
 	cv_init(&sc->sc_condvar, device_xname(self));
 
 	(void)pmf_device_register(self, NULL, acpibat_resume);
-	(void)memset(sc->sc_serial, '\0', sizeof(sc->sc_serial));
 	(void)acpi_register_notify(sc->sc_node, acpibat_notify_handler);
 
 	sc->sc_sensor = kmem_zalloc(ACPIBAT_COUNT *
@@ -442,7 +444,8 @@
 acpibat_print_info(device_t dv, ACPI_OBJECT *elm)
 {
 	struct acpibat_softc *sc = device_private(dv);
-	const char *model, *serial, *tech, *unit;
+	const char *tech, *unit;
+	int32_t dcap, dvol;
 	int i;
 
 	for (i = ACPIBAT_BIF_OEM; i > ACPIBAT_BIF_GRANULARITY2; i--) {
@@ -457,20 +460,17 @@
 			return;
 	}
 
-	model = elm[ACPIBAT_BIF_MODEL].String.Pointer;
-	serial = elm[ACPIBAT_BIF_SERIAL].String.Pointer;
+	dcap = elm[ACPIBAT_BIF_DCAPACITY].Integer.Value;
+	dvol = elm[ACPIBAT_BIF_DVOLTAGE].Integer.Value;
 
-	if (elm[ACPIBAT_BIF_SERIAL].String.Length > sizeof(sc->sc_serial))
+	/*
+	 * Try to detect whether the battery was switched.
+	 */
+	if (sc->sc_dcapacity == dcap && sc->sc_dvoltage == dvol)
 		return;
-
-	if (sc->sc_serial[0] == '\0')
-		(void)strlcpy(sc->sc_serial, serial, sizeof(sc->sc_serial));
 	else {
-		if (strcmp(sc->sc_serial, serial) == 0)
-			return;
-
-		(void)memset(sc->sc_serial, '\0', sizeof(sc->sc_serial));
-		(void)strlcpy(sc->sc_serial, serial, sizeof(sc->sc_serial));
+		sc->sc_dcapacity = dcap;
+		sc->sc_dvoltage = dvol;
 	}
 
 	tech = (elm[ACPIBAT_BIF_TECHNOLOGY].Integer.Value != 0) ?
@@ -480,8 +480,9 @@
 	    elm[ACPIBAT_BIF_OEM].String.Pointer,
 	    elm[ACPIBAT_BIF_TYPE].String.Pointer, tech);
 
-	aprint_verbose_dev(dv, "model number %s, serial number %s\n",
-	    model, serial);
+	aprint_debug_dev(dv, "model number %s, serial number %s\n",
+	    elm[ACPIBAT_BIF_MODEL].String.Pointer,
+	    elm[ACPIBAT_BIF_SERIAL].String.Pointer);
 
 #define SCALE(x) (((int)x) / 1000000), ((((int)x) % 1000000) / 1000)
 

Reply via email to