From owner-acpi-jp@jp.freebsd.org  Fri Dec 22 21:35:29 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id VAA23990;
	Fri, 22 Dec 2000 21:35:29 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id VAA23985
	for <acpi-jp@jp.freebsd.org>; Fri, 22 Dec 2000 21:35:28 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (iwasaki.imasy.or.jp [202.227.24.92])
	by tasogare.imasy.or.jp (8.11.1+3.4W/3.7W-tasogare/smtpfeed 1.07) with ESMTP id eBMCZOk61428
	for <acpi-jp@jp.freebsd.org>; Fri, 22 Dec 2000 21:35:24 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: acpi-jp@jp.freebsd.org
In-Reply-To: <20001222194336L.iwasaki@jp.FreeBSD.org>
References: <200012160739.eBG7d4O01273@mass.osd.bsdi.com>
	<200012221026.TAA72534@shidahara1.planet.sci.kobe-u.ac.jp>
	<20001222194336L.iwasaki@jp.FreeBSD.org>
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20001222213452U.iwasaki@jp.FreeBSD.org>
Date: Fri, 22 Dec 2000 21:34:52 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 312
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: acpi-jp 992
Subject: [acpi-jp 992] Re: Some power device driver. 
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

Here my patches for them.

acpi_acad.c:
 - Add one more device check notification handling (0x01).
 - style fix.

acpi_cmbat.c:
 - proper string data copying from ACPI_OBJECT.
 - better memory allocation and recycling for ACPI_BUFFER.
 - style fix.

Thanks

--- acpi_acad.c-	Fri Dec 22 20:46:08 2000
+++ acpi_acad.c	Fri Dec 22 21:22:06 2000
@@ -43,8 +43,9 @@
 #include <dev/acpica/acpiio.h>
  
 
-#define ACPI_POWERSOURCE_STAT_CHANGE 0x80
-#define ACPI_DEVICE_CHECK 0
+#define ACPI_DEVICE_CHECK_PNP		0x00
+#define ACPI_DEVICE_CHECK_EXISTENCE	0x01
+#define ACPI_POWERSOURCE_STAT_CHANGE	0x80
 
 static void acpi_acad_get_status(void * );
 static void acpi_acad_notify_handler(ACPI_HANDLE , UINT32 ,void *);
@@ -55,24 +56,27 @@
 	int status;
 };
 
-static void acpi_acad_get_status(void * context)
+static void
+acpi_acad_get_status(void *context)
 {
 	device_t dev = context;
 	struct acpi_acad_softc *sc = device_get_softc(dev);
 	ACPI_HANDLE h = acpi_get_handle(dev);
 
-	if(acpi_EvaluateNumber(h,"_PSR",&sc->status) != AE_OK)
+	if (acpi_EvaluateNumber(h, "_PSR", &sc->status) != AE_OK)
 		return;
 	device_printf(dev,"%s\n",(sc->status) ? "On Line" : "Off Line");
 }
 
-static void acpi_acad_notify_handler(ACPI_HANDLE h, UINT32 notify,
- void *context)
+static void
+acpi_acad_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
 {
 	device_t dev = context;
-	device_printf(dev,"Notify %d\n",notify);
-	switch(notify){
-	case ACPI_DEVICE_CHECK:
+
+	device_printf(dev, "Notify %d\n", notify);
+	switch (notify) {
+	case ACPI_DEVICE_CHECK_PNP:
+	case ACPI_DEVICE_CHECK_EXISTENCE:
 	case ACPI_POWERSOURCE_STAT_CHANGE:
 		/*Temporally. It is better to notify policy manager*/
 		AcpiOsQueueForExecution(OSD_PRIORITY_LO,
@@ -82,7 +86,9 @@
 		break;
 	}
 }
-static int acpi_acad_probe(device_t dev)
+
+static int
+acpi_acad_probe(device_t dev)
 {
 
     if ((acpi_get_type(dev) == ACPI_TYPE_DEVICE) &&
@@ -97,20 +103,21 @@
     return(ENXIO);
 }
 
-static int acpi_acad_attach(device_t dev)
+static int
+acpi_acad_attach(device_t dev)
 {
 
 	ACPI_HANDLE handle = acpi_get_handle(dev);
 	AcpiInstallNotifyHandler(handle, 
 				 ACPI_DEVICE_NOTIFY,
-				 acpi_acad_notify_handler,dev);
+				 acpi_acad_notify_handler, dev);
 	/*Installing system notify is not so good*/
 	AcpiInstallNotifyHandler(handle, 
 				 ACPI_SYSTEM_NOTIFY,
-				 acpi_acad_notify_handler,dev);
+				 acpi_acad_notify_handler, dev);
 
 	acpi_acad_get_status((void *)dev);
-	return 0;
+	return(0);
 }
 
 static device_method_t acpi_acad_methods[] = {
--- acpi_cmbat.c-	Fri Dec 22 19:47:35 2000
+++ acpi_cmbat.c	Fri Dec 22 20:57:35 2000
@@ -48,8 +48,8 @@
 	device_t	dev;
 	struct acpi_bif	bif;
 	struct acpi_bst bst;
-	size_t     bif_size;
-	size_t     bst_size;
+	ACPI_BUFFER	bif_buffer;
+	ACPI_BUFFER	bst_buffer;
 };
 
 /* XXX: devclass_get_maxunit() don't give us the current allocated units... */
@@ -66,19 +66,27 @@
 } while(0)
 
 #define PKG_GETSTR(res, tmp, idx, dest, size, label) do {              	\
+	size_t	length;							\
+	length = size;							\
 	tmp = &res->Package.Elements[idx]; 				\
 	bzero(dest, sizeof(dest));					\
 	switch (tmp->Type) {						\
 	case ACPI_TYPE_STRING:						\
-		strncpy(dest, tmp->String.Pointer, size);		\
+		if (tmp->String.Length < length) {			\
+			length = tmp->String.Length;			\
+		}							\
+		strncpy(dest, tmp->String.Pointer, length);		\
 		break;							\
 	case ACPI_TYPE_BUFFER:						\
-		strncpy(dest, tmp->Buffer.Pointer, size);		\
+		if (tmp->Buffer.Length < length) {			\
+			length = tmp->String.Length;			\
+		}							\
+		strncpy(dest, tmp->Buffer.Pointer, length);		\
 		break;							\
 	default:							\
 		goto label;						\
 	}								\
-	dest[size-1] = '\0';						\
+	dest[length-1] = '\0';						\
 } while(0)
 
 static void
@@ -87,38 +95,41 @@
 	device_t	dev = context;
 	struct acpi_cmbat_softc	*sc = device_get_softc(dev);
 	ACPI_STATUS	as;
-	ACPI_BUFFER	b;
 	ACPI_OBJECT	*res, *tmp;
 	ACPI_HANDLE	h = acpi_get_handle(dev);
 	
 retry:
-	b.Length = sc->bst_size;
+	if (sc->bst_buffer.Length == 0) {
+		sc->bst_buffer.Pointer = NULL;
+		as = AcpiEvaluateObject(h, "_BST", NULL, &sc->bst_buffer);
+		if (as != AE_BUFFER_OVERFLOW){
+			device_printf(dev, "CANNOT FOUND _BST (%d)\n", as);
+			return;
+		}
 
-	if(!b.Length){
-		b.Pointer = NULL;
-	}else {
-		if(!(b.Pointer = malloc(b.Length, M_TEMP, M_NOWAIT))){
+		sc->bst_buffer.Pointer = malloc(sc->bst_buffer.Length, M_DEVBUF, M_NOWAIT);
+		if (sc->bst_buffer.Pointer == NULL) {
 			device_printf(dev,"malloc failed");
 			return;
 		}
 	}
 
-	as = AcpiEvaluateObject(h, "_BST", NULL, &b);
+	as = AcpiEvaluateObject(h, "_BST", NULL, &sc->bst_buffer);
 
-	if(as == AE_BUFFER_OVERFLOW){
-		sc->bst_size = b.Length;
-		if(b.Pointer){
-			free(b.Pointer, M_TEMP);
+	if (as == AE_BUFFER_OVERFLOW){
+		if (sc->bst_buffer.Pointer){
+			free(sc->bst_buffer.Pointer, M_DEVBUF);
 		}
-		device_printf(dev,"bst_size changed to %d\n",sc->bst_size);
+		device_printf(dev, "bst size changed to %d\n", sc->bst_buffer.Length);
+		sc->bst_buffer.Length = 0;
 		goto retry;
-	}else if(as != AE_OK){
+	} else if (as != AE_OK){
 		device_printf(dev, "CANNOT FOUND _BST (%d)\n", as);
 		return;
 	}
 
-	res = b.Pointer;
-	
+	res = sc->bst_buffer.Pointer;
+
 	if ((res->Type != ACPI_TYPE_PACKAGE) && (res->Package.Count < 4))
 		return ;
 
@@ -127,7 +138,6 @@
 	PKG_GETINT(res, tmp, 2, sc->bst.cap, end);
 	PKG_GETINT(res, tmp, 3, sc->bst.volt, end);
 end:
-	free(b.Pointer, M_TEMP);
 }
 
 static void
@@ -135,38 +145,41 @@
 {
 	device_t	dev = context;
 	struct acpi_cmbat_softc	*sc = device_get_softc(dev);
-	ACPI_BUFFER	b;
 	ACPI_STATUS	as;
 	ACPI_HANDLE	h = acpi_get_handle(dev);
 	ACPI_OBJECT	*res, *tmp;
 
 retry:
-	b.Length = sc->bif_size;
-	
-	if(!b.Length){
-		b.Pointer = NULL;
-	}else {
-		if(!(b.Pointer = malloc(b.Length, M_TEMP, M_NOWAIT))){
+	if (sc->bif_buffer.Length == 0) {
+		sc->bif_buffer.Pointer = NULL;
+		as = AcpiEvaluateObject(h, "_BST", NULL, &sc->bif_buffer);
+		if (as != AE_BUFFER_OVERFLOW){
+			device_printf(dev, "CANNOT FOUND _BST (%d)\n", as);
+			return;
+		}
+
+		sc->bif_buffer.Pointer = malloc(sc->bif_buffer.Length, M_DEVBUF, M_NOWAIT);
+		if (sc->bif_buffer.Pointer == NULL) {
 			device_printf(dev,"malloc failed");
 			return;
 		}
 	}
 
-	as = AcpiEvaluateObject(h, "_BIF", NULL, &b);
-	if(as == AE_BUFFER_OVERFLOW){
-		sc->bif_size = b.Length;
-		if(b.Pointer){
-			free(b.Pointer, M_TEMP);
+	as = AcpiEvaluateObject(h, "_BST", NULL, &sc->bif_buffer);
+
+	if (as == AE_BUFFER_OVERFLOW){
+		if (sc->bif_buffer.Pointer){
+			free(sc->bif_buffer.Pointer, M_DEVBUF);
 		}
-		device_printf(dev,"bif_size changed to %d\n",sc->bif_size);
+		device_printf(dev, "bif size changed to %d\n", sc->bif_buffer.Length);
+		sc->bif_buffer.Length = 0;
 		goto retry;
-
-	}else if(as != AE_OK){
-		device_printf(dev, "CANNOT FOUND _BIF (%d)\n", as);
+	} else if (as != AE_OK){
+		device_printf(dev, "CANNOT FOUND _BST (%d)\n", as);
 		return;
 	}
-	
-	res = b.Pointer;
+
+	res = sc->bif_buffer.Pointer;
 	if ((res->Type != ACPI_TYPE_PACKAGE) && (res->Package.Count < 13))
 		return ;
 
@@ -184,13 +197,17 @@
 	PKG_GETSTR(res, tmp, 11, sc->bif.type, ACPI_CMBAT_MAXSTRLEN, end);
 	PKG_GETSTR(res, tmp, 12, sc->bif.oeminfo, ACPI_CMBAT_MAXSTRLEN, end);
 end:
-	free(b.Pointer, M_TEMP);
 }
 
 static void
 acpi_cmbat_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
 {
 	switch (notify) {
+#if 0
+	/* XXX
+	 * AML method execution is somewhat heavy even using swi.
+	 * better to disable them until we fix the problem.
+	 */
 	case ACPI_BATTERY_BST_CHANGE:
 		AcpiOsQueueForExecution(OSD_PRIORITY_LO,
 		    acpi_cmbat_get_bst, context);
@@ -199,6 +216,7 @@
 		AcpiOsQueueForExecution(OSD_PRIORITY_LO,
 		    acpi_cmbat_get_bif, context);
 		break;
+#endif
 	default:
 		break;
 	}
@@ -227,8 +245,8 @@
 	sc = device_get_softc(dev);
 	AcpiInstallNotifyHandler(handle, ACPI_DEVICE_NOTIFY,
 				 acpi_cmbat_notify_handler,dev);
-	sc->bif_size = 0;
-	sc->bst_size = 0;
+	bzero(&sc->bif_buffer, sizeof(sc->bif_buffer));
+	bzero(&sc->bst_buffer, sizeof(sc->bst_buffer));
 	
 	acpi_cmbat_get_bif(dev);
 	acpi_cmbat_get_bst(dev);
@@ -255,5 +273,3 @@
 
 static devclass_t acpi_cmbat_devclass;
 DRIVER_MODULE(acpi_cmbat, acpi, acpi_cmbat_driver, acpi_cmbat_devclass, 0, 0);
-
-
