summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2006-08-08 01:33:03 +0000
committernjl <njl@FreeBSD.org>2006-08-08 01:33:03 +0000
commite6ea7f8e9cea37abfe2f44afd8fe6125d1d59c1c (patch)
treecabb82179b96cf68e08322ca36886468b174b12e /sys/dev/acpica
parent6b5ea5533318ef3d343dbedd0be1c6007f0bec51 (diff)
downloadFreeBSD-src-e6ea7f8e9cea37abfe2f44afd8fe6125d1d59c1c.zip
FreeBSD-src-e6ea7f8e9cea37abfe2f44afd8fe6125d1d59c1c.tar.gz
Remove the global dock variable. Each dock device should be able to
function independently. This change is not only load-tested since I don't have hardware that supports acpi_dock. Clean up comments and a name a few constants.
Diffstat (limited to 'sys/dev/acpica')
-rw-r--r--sys/dev/acpica/acpi_dock.c71
1 files changed, 33 insertions, 38 deletions
diff --git a/sys/dev/acpica/acpi_dock.c b/sys/dev/acpica/acpi_dock.c
index 97f558a..277c1f4 100644
--- a/sys/dev/acpica/acpi_dock.c
+++ b/sys/dev/acpica/acpi_dock.c
@@ -51,9 +51,11 @@ ACPI_MODULE_NAME("DOCK")
#define ACPI_DOCK_STATUS_UNDOCKED 0
#define ACPI_DOCK_STATUS_DOCKED 1
-/* Prevent the device from being removed or not. */
-#define ACPI_DOCK_UNLOCK 0
-#define ACPI_DOCK_LOCK 1
+#define ACPI_DOCK_UNLOCK 0 /* Allow device to be ejected */
+#define ACPI_DOCK_LOCK 1 /* Prevent dev from being removed */
+
+#define ACPI_DOCK_ISOLATE 0 /* Isolate from dock connector */
+#define ACPI_DOCK_CONNECT 1 /* Connect to dock */
struct acpi_dock_softc {
int _sta;
@@ -64,9 +66,6 @@ struct acpi_dock_softc {
struct sysctl_oid *sysctl_tree;
};
-/* Global docking status, for avoiding duplicated docking */
-static int acpi_dock_status = ACPI_DOCK_STATUS_UNKNOWN;
-
ACPI_SERIAL_DECL(dock, "ACPI Docking Station");
/*
@@ -116,7 +115,7 @@ acpi_dock_execute_dck(device_t dev, int dock)
/*
* When _DCK is called with 0, OSPM will ignore the return value.
*/
- if (dock == ACPI_DOCK_STATUS_UNDOCKED)
+ if (dock == ACPI_DOCK_ISOLATE)
return (0);
/* If _DCK returned 1, the request succeeded. */
@@ -127,7 +126,7 @@ acpi_dock_execute_dck(device_t dev, int dock)
return (-1);
}
-/* Lock devices while docked. */
+/* Lock devices while docked to prevent surprise removal. */
static void
acpi_dock_execute_lck(device_t dev, int lock)
{
@@ -137,6 +136,7 @@ acpi_dock_execute_lck(device_t dev, int lock)
acpi_SetInteger(h, "_LCK", lock);
}
+/* Eject a device (i.e., motorized). */
static int
acpi_dock_execute_ejx(device_t dev, int eject, int state)
{
@@ -153,6 +153,7 @@ acpi_dock_execute_ejx(device_t dev, int eject, int state)
return (-1);
}
+/* Find dependent devices. When their parent is removed, so are they. */
static int
acpi_dock_is_ejd_device(ACPI_HANDLE dock_handle, ACPI_HANDLE handle)
{
@@ -267,17 +268,17 @@ acpi_dock_insert(device_t dev)
sc = device_get_softc(dev);
h = acpi_get_handle(dev);
- if (acpi_dock_status == ACPI_DOCK_STATUS_UNDOCKED ||
- acpi_dock_status == ACPI_DOCK_STATUS_UNKNOWN) {
+ if (sc->status == ACPI_DOCK_STATUS_UNDOCKED ||
+ sc->status == ACPI_DOCK_STATUS_UNKNOWN) {
acpi_dock_execute_lck(dev, ACPI_DOCK_LOCK);
- if (acpi_dock_execute_dck(dev, 1) != 0) {
+ if (acpi_dock_execute_dck(dev, ACPI_DOCK_CONNECT) != 0) {
device_printf(dev, "_DCK failed\n");
return;
}
if (!cold)
acpi_dock_insert_children(dev);
- sc->status = acpi_dock_status = ACPI_DOCK_STATUS_DOCKED;
+ sc->status = ACPI_DOCK_STATUS_DOCKED;
}
}
@@ -334,10 +335,10 @@ acpi_dock_removal(device_t dev)
ACPI_SERIAL_ASSERT(dock);
sc = device_get_softc(dev);
- if (acpi_dock_status == ACPI_DOCK_STATUS_DOCKED ||
- acpi_dock_status == ACPI_DOCK_STATUS_UNKNOWN) {
+ if (sc->status == ACPI_DOCK_STATUS_DOCKED ||
+ sc->status == ACPI_DOCK_STATUS_UNKNOWN) {
acpi_dock_eject_children(dev);
- if (acpi_dock_execute_dck(dev, 0) != 0)
+ if (acpi_dock_execute_dck(dev, ACPI_DOCK_ISOLATE) != 0)
return;
acpi_dock_execute_lck(dev, ACPI_DOCK_UNLOCK);
@@ -347,7 +348,7 @@ acpi_dock_removal(device_t dev)
return;
}
- sc->status = acpi_dock_status = ACPI_DOCK_STATUS_UNDOCKED;
+ sc->status = ACPI_DOCK_STATUS_UNDOCKED;
}
acpi_dock_get_info(dev);
@@ -370,12 +371,14 @@ acpi_dock_device_check(device_t dev)
acpi_dock_get_info(dev);
/*
- * If the _STA indicates 'present' and 'functioning',
- * the system is docked.
+ * If the _STA method indicates 'present' and 'functioning', the
+ * system is docked. If _STA does not exist for this device, it
+ * is always present.
*/
- if (ACPI_DEVICE_PRESENT(sc->_sta))
+ if (sc->_sta == ACPI_DOCK_STATUS_UNKNOWN ||
+ ACPI_DEVICE_PRESENT(sc->_sta))
acpi_dock_insert(dev);
- if (sc->_sta == 0)
+ else if (sc->_sta == 0)
acpi_dock_removal(dev);
}
@@ -413,22 +416,23 @@ acpi_dock_status_sysctl(SYSCTL_HANDLER_ARGS)
{
struct acpi_dock_softc *sc;
device_t dev;
- int status, err;
+ int status, err;
err = 0;
- dev = (device_t)arg1;
+ dev = (device_t)arg1;
+
sc = device_get_softc(dev);
- status = sc->status;
+ status = sc->status;
ACPI_SERIAL_BEGIN(dock);
- err = sysctl_handle_int(oidp, &status, 0, req);
- if (err != 0 || req->newptr == NULL)
- goto out;
+ err = sysctl_handle_int(oidp, &status, 0, req);
+ if (err != 0 || req->newptr == NULL)
+ goto out;
if (status != ACPI_DOCK_STATUS_UNDOCKED &&
status != ACPI_DOCK_STATUS_DOCKED) {
err = EINVAL;
- goto out;
+ goto out;
}
if (status == sc->status)
@@ -460,9 +464,6 @@ acpi_dock_probe(device_t dev)
ACPI_FAILURE(AcpiGetHandle(h, "_DCK", &tmp)))
return (ENXIO);
- if (acpi_dock_status == ACPI_DOCK_STATUS_DOCKED)
- return (ENXIO);
-
device_set_desc(dev, "ACPI Docking Station");
/*
@@ -479,14 +480,8 @@ acpi_dock_attach(device_t dev)
ACPI_HANDLE h;
sc = device_get_softc(dev);
- if (sc == NULL)
- return (ENXIO);
-
h = acpi_get_handle(dev);
- if (h == NULL)
- return (ENXIO);
-
- if (acpi_dock_status == ACPI_DOCK_STATUS_DOCKED)
+ if (sc == NULL || h == NULL)
return (ENXIO);
sc->status = ACPI_DOCK_STATUS_UNKNOWN;
@@ -497,7 +492,7 @@ acpi_dock_attach(device_t dev)
acpi_dock_device_check(dev);
- /* Get the sysctl tree */
+ /* Get the sysctl tree */
sc->sysctl_ctx = device_get_sysctl_ctx(dev);
sc->sysctl_tree = device_get_sysctl_tree(dev);
OpenPOWER on IntegriCloud