Author: jkim
Date: Fri Aug  6 23:35:33 2010
New Revision: 210977
URL: http://svn.freebsd.org/changeset/base/210977

Log:
  When EC burst mode is activated and multiple bytes are accessed, do not
  disable and enable repeatedly, just do it once per call.  It also reduces
  code duplication.  Check all parameters early and fail immediately.

Modified:
  head/sys/dev/acpica/acpi_ec.c

Modified: head/sys/dev/acpica/acpi_ec.c
==============================================================================
--- head/sys/dev/acpica/acpi_ec.c       Fri Aug  6 23:11:19 2010        
(r210976)
+++ head/sys/dev/acpica/acpi_ec.c       Fri Aug  6 23:35:33 2010        
(r210977)
@@ -720,24 +720,19 @@ EcSpaceHandler(UINT32 Function, ACPI_PHY
               UINT64 *Value, void *Context, void *RegionContext)
 {
     struct acpi_ec_softc       *sc = (struct acpi_ec_softc *)Context;
-    ACPI_STATUS                        Status;
+    ACPI_PHYSICAL_ADDRESS      EcAddr;
     UINT8                      *EcData;
-    UINT8                      EcAddr;
-    int                                bytes, i;
+    ACPI_STATUS                        Status;
 
     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, (UINT32)Address);
 
+    if (Function != ACPI_READ && Function != ACPI_WRITE)
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
     if (Width % 8 != 0 || Value == NULL || Context == NULL)
        return_ACPI_STATUS (AE_BAD_PARAMETER);
-    bytes = Width / 8;
-    if (Address + bytes - 1 > 0xFF)
+    if (Address + Width / 8 > 256)
        return_ACPI_STATUS (AE_BAD_ADDRESS);
 
-    if (Function == ACPI_READ)
-       *Value = 0;
-    EcAddr = Address;
-    EcData = (UINT8 *)Value;
-
     /*
      * If booting, check if we need to run the query handler.  If so, we
      * we call it directly here since our thread taskq is not active yet.
@@ -754,8 +749,21 @@ EcSpaceHandler(UINT32 Function, ACPI_PHY
     if (ACPI_FAILURE(Status))
        return_ACPI_STATUS (Status);
 
+    /* If we can't start burst mode, continue anyway. */
+    Status = EcCommand(sc, EC_COMMAND_BURST_ENABLE);
+    if (ACPI_SUCCESS(Status)) {
+       if (EC_GET_DATA(sc) == EC_BURST_ACK) {
+           CTR0(KTR_ACPI, "ec burst enabled");
+           sc->ec_burstactive = TRUE;
+       }
+    }
+
     /* Perform the transaction(s), based on Width. */
-    for (i = 0; i < bytes; i++, EcAddr++, EcData++) {
+    EcAddr = Address;
+    EcData = (UINT8 *)Value;
+    if (Function == ACPI_READ)
+       *Value = 0;
+    do {
        switch (Function) {
        case ACPI_READ:
            Status = EcRead(sc, EcAddr, EcData);
@@ -763,14 +771,17 @@ EcSpaceHandler(UINT32 Function, ACPI_PHY
        case ACPI_WRITE:
            Status = EcWrite(sc, EcAddr, *EcData);
            break;
-       default:
-           device_printf(sc->ec_dev, "invalid EcSpaceHandler function %d\n",
-                         Function);
-           Status = AE_BAD_PARAMETER;
-           break;
        }
        if (ACPI_FAILURE(Status))
            break;
+       EcAddr++;
+       EcData++;
+    } while (EcAddr < Address + Width / 8);
+
+    if (sc->ec_burstactive) {
+       sc->ec_burstactive = FALSE;
+       if (ACPI_SUCCESS(EcCommand(sc, EC_COMMAND_BURST_DISABLE)))
+           CTR0(KTR_ACPI, "ec disabled burst ok");
     }
 
     EcUnlock(sc);
@@ -943,22 +954,11 @@ static ACPI_STATUS
 EcRead(struct acpi_ec_softc *sc, UINT8 Address, UINT8 *Data)
 {
     ACPI_STATUS        status;
-    UINT8 data;
     u_int gen_count;
 
     ACPI_SERIAL_ASSERT(ec);
     CTR1(KTR_ACPI, "ec read from %#x", Address);
 
-    /* If we can't start burst mode, continue anyway. */
-    status = EcCommand(sc, EC_COMMAND_BURST_ENABLE);
-    if (status == AE_OK) {
-       data = EC_GET_DATA(sc);
-       if (data == EC_BURST_ACK) {
-           CTR0(KTR_ACPI, "ec burst enabled");
-           sc->ec_burstactive = TRUE;
-       }
-    }
-
     status = EcCommand(sc, EC_COMMAND_READ);
     if (ACPI_FAILURE(status))
        return (status);
@@ -972,14 +972,6 @@ EcRead(struct acpi_ec_softc *sc, UINT8 A
     }
     *Data = EC_GET_DATA(sc);
 
-    if (sc->ec_burstactive) {
-       sc->ec_burstactive = FALSE;
-       status = EcCommand(sc, EC_COMMAND_BURST_DISABLE);
-       if (ACPI_FAILURE(status))
-           return (status);
-       CTR0(KTR_ACPI, "ec disabled burst ok");
-    }
-
     return (AE_OK);
 }
 
@@ -987,22 +979,11 @@ static ACPI_STATUS
 EcWrite(struct acpi_ec_softc *sc, UINT8 Address, UINT8 Data)
 {
     ACPI_STATUS        status;
-    UINT8 data;
     u_int gen_count;
 
     ACPI_SERIAL_ASSERT(ec);
     CTR2(KTR_ACPI, "ec write to %#x, data %#x", Address, Data);
 
-    /* If we can't start burst mode, continue anyway. */
-    status = EcCommand(sc, EC_COMMAND_BURST_ENABLE);
-    if (status == AE_OK) {
-       data = EC_GET_DATA(sc);
-       if (data == EC_BURST_ACK) {
-           CTR0(KTR_ACPI, "ec burst enabled");
-           sc->ec_burstactive = TRUE;
-       }
-    }
-
     status = EcCommand(sc, EC_COMMAND_WRITE);
     if (ACPI_FAILURE(status))
        return (status);
@@ -1023,13 +1004,5 @@ EcWrite(struct acpi_ec_softc *sc, UINT8 
        return (status);
     }
 
-    if (sc->ec_burstactive) {
-       sc->ec_burstactive = FALSE;
-       status = EcCommand(sc, EC_COMMAND_BURST_DISABLE);
-       if (ACPI_FAILURE(status))
-           return (status);
-       CTR0(KTR_ACPI, "ec disabled burst ok");
-    }
-
     return (AE_OK);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to