summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2004-03-04 05:58:50 +0000
committernjl <njl@FreeBSD.org>2004-03-04 05:58:50 +0000
commit17bb63efbc0576661dccb349260658480199dcd0 (patch)
treecec444380b9958fa970b1190eb18b0ba787a47a7 /sys/dev
parent02a9c630feda486dca757a1fcaf7e784526ad58a (diff)
downloadFreeBSD-src-17bb63efbc0576661dccb349260658480199dcd0.zip
FreeBSD-src-17bb63efbc0576661dccb349260658480199dcd0.tar.gz
Fix an off-by-one error and rework our EC space handler. Writing to address
0xFF would fail previously as AE_BAD_PARAMETER. It's unknown if this caused any actual problems.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpica/acpi_ec.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/sys/dev/acpica/acpi_ec.c b/sys/dev/acpica/acpi_ec.c
index 656a6dc..5eca9a8 100644
--- a/sys/dev/acpica/acpi_ec.c
+++ b/sys/dev/acpica/acpi_ec.c
@@ -713,28 +713,33 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width,
ACPI_INTEGER *Value, void *Context, void *RegionContext)
{
struct acpi_ec_softc *sc = (struct acpi_ec_softc *)Context;
- ACPI_STATUS Status = AE_OK;
+ ACPI_STATUS Status;
UINT8 EcAddr, EcData;
int i;
ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, (UINT32)Address);
- if (Address > 0xFF || width % 8 != 0 || Value == NULL || Context == NULL)
+ if (width % 8 != 0 || Value == NULL || Context == NULL)
return_ACPI_STATUS (AE_BAD_PARAMETER);
+ if (Address + (width / 8) - 1 > 0xFF)
+ return_ACPI_STATUS (AE_BAD_ADDRESS);
- /*
- * Perform the transaction.
- */
+ if (Function == ACPI_READ)
+ *Value = 0;
EcAddr = Address;
- for (i = 0; i < width; i += 8) {
+ Status = AE_ERROR;
+
+ /* Perform the transaction(s), based on width. */
+ for (i = 0; i < width; i += 8, EcAddr++) {
Status = EcLock(sc);
if (ACPI_FAILURE(Status))
- return (Status);
+ break;
switch (Function) {
case ACPI_READ:
- EcData = 0;
Status = EcRead(sc, EcAddr, &EcData);
+ if (ACPI_SUCCESS(Status))
+ *Value |= ((ACPI_INTEGER)EcData) << i;
break;
case ACPI_WRITE:
EcData = (UINT8)((*Value) >> i);
@@ -746,15 +751,11 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width,
Status = AE_BAD_PARAMETER;
break;
}
-
EcUnlock(sc);
if (ACPI_FAILURE(Status))
- return (Status);
-
- *Value |= (ACPI_INTEGER)EcData << i;
- if (++EcAddr == 0)
- return_ACPI_STATUS (AE_BAD_PARAMETER);
+ break;
}
+
return_ACPI_STATUS (Status);
}
OpenPOWER on IntegriCloud