Module Name:    src
Committed By:   jruoho
Date:           Wed Jun 30 15:38:27 UTC 2010

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

Log Message:
Only aprint*() the battery information if the battery has changed. Based on
suggestion from m...@. The used serial number is hopefully unique enough as
an identifier. Should fix PR kern/43505 by David Demelier.


To generate a diff of this commit:
cvs rdiff -u -r1.102 -r1.103 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.102 src/sys/dev/acpi/acpi_bat.c:1.103
--- src/sys/dev/acpi/acpi_bat.c:1.102	Tue Apr 27 05:57:43 2010
+++ src/sys/dev/acpi/acpi_bat.c	Wed Jun 30 15:38:27 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_bat.c,v 1.102 2010/04/27 05:57:43 jruoho Exp $	*/
+/*	$NetBSD: acpi_bat.c,v 1.103 2010/06/30 15:38:27 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.102 2010/04/27 05:57:43 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.103 2010/06/30 15:38:27 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -149,6 +149,7 @@
 	struct acpi_devnode	*sc_node;
 	struct sysmon_envsys	*sc_sme;
 	envsys_data_t		*sc_sensor;
+	char			 sc_serial[64];
 	kmutex_t		 sc_mutex;
 	kcondvar_t		 sc_condvar;
 	int32_t			 sc_lcapacity;
@@ -237,6 +238,7 @@
 	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 *
@@ -427,7 +429,8 @@
 static void
 acpibat_print_info(device_t dv, ACPI_OBJECT *elm)
 {
-	const char *tech, *unit;
+	struct acpibat_softc *sc = device_private(dv);
+	const char *model, *serial, *tech, *unit;
 	int i;
 
 	for (i = ACPIBAT_BIF_OEM; i > ACPIBAT_BIF_GRANULARITY2; i--) {
@@ -437,6 +440,25 @@
 
 		if (elm[i].String.Pointer == NULL)
 			return;
+
+		if (elm[i].String.Pointer[0] == '\0')
+			return;
+	}
+
+	model = elm[ACPIBAT_BIF_MODEL].String.Pointer;
+	serial = elm[ACPIBAT_BIF_SERIAL].String.Pointer;
+
+	if (elm[ACPIBAT_BIF_SERIAL].String.Length > sizeof(sc->sc_serial))
+		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));
 	}
 
 	tech = (elm[ACPIBAT_BIF_TECHNOLOGY].Integer.Value != 0) ?
@@ -446,24 +468,8 @@
 	    elm[ACPIBAT_BIF_OEM].String.Pointer,
 	    elm[ACPIBAT_BIF_TYPE].String.Pointer, tech);
 
-	if (elm[ACPIBAT_BIF_SERIAL].String.Pointer[0] ||
-	    elm[ACPIBAT_BIF_MODEL].String.Pointer[0]) {
-		int comma;
-		aprint_verbose_dev(dv, "");
-
-		if (elm[ACPIBAT_BIF_SERIAL].String.Pointer[0]) {
-			aprint_verbose("serial number %s",
-			    elm[ACPIBAT_BIF_SERIAL].String.Pointer);
-			comma = 1;
-		} else
-			comma = 0;
-
-		if (elm[ACPIBAT_BIF_MODEL].String.Pointer[0])
-			aprint_verbose("%smodel number %s",
-			    comma ? ", " : "",
-			    elm[ACPIBAT_BIF_MODEL].String.Pointer);
-		aprint_verbose("\n");
-	}
+	aprint_verbose_dev(dv, "model number %s, serial number %s\n",
+	    model, serial);
 
 #define SCALE(x) (((int)x) / 1000000), ((((int)x) % 1000000) / 1000)
 
@@ -482,8 +488,9 @@
 		unit = "Ah";
 	else
 		unit = "Wh";
-	aprint_verbose_dev(dv, "low->warn granularity: %d.%03d%s, "
-	    "warn->full granularity: %d.%03d%s\n",
+
+	aprint_verbose_dev(dv, "granularity: "
+	    "low->warn %d.%03d %s, warn->full %d.%03d %s\n",
 	    SCALE(elm[ACPIBAT_BIF_GRANULARITY1].Integer.Value * 1000), unit,
 	    SCALE(elm[ACPIBAT_BIF_GRANULARITY2].Integer.Value * 1000), unit);
 }

Reply via email to