patch-2.4.27 linux-2.4.27/drivers/hotplug/acpiphp_glue.c
Next file: linux-2.4.27/drivers/hotplug/acpiphp_pci.c
Previous file: linux-2.4.27/drivers/hotplug/acpiphp_core.c
Back to the patch index
Back to the overall index
- Lines: 227
- Date:
2004-08-07 16:26:04.737350188 -0700
- Orig file:
linux-2.4.26/drivers/hotplug/acpiphp_glue.c
- Orig date:
2003-11-28 10:26:20.000000000 -0800
diff -urN linux-2.4.26/drivers/hotplug/acpiphp_glue.c linux-2.4.27/drivers/hotplug/acpiphp_glue.c
@@ -26,12 +26,12 @@
*
*/
-#include <linux/config.h>
-#include <linux/kernel.h>
+#include <linux/init.h>
#include <linux/module.h>
+
+#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/smp_lock.h>
-#include <linux/init.h>
#include <asm/semaphore.h>
#include "pci_hotplug.h"
@@ -389,12 +389,8 @@
static void decode_hpp(struct acpiphp_bridge *bridge)
{
acpi_status status;
-#if ACPI_CA_VERSION < 0x20020201
- acpi_buffer buffer;
-#else
struct acpi_buffer buffer = { .length = ACPI_ALLOCATE_BUFFER,
.pointer = NULL};
-#endif
union acpi_object *package;
int i;
@@ -404,21 +400,7 @@
bridge->hpp.enable_SERR = 0;
bridge->hpp.enable_PERR = 0;
-#if ACPI_CA_VERSION < 0x20020201
- buffer.length = 0;
- buffer.pointer = NULL;
-
- status = acpi_evaluate_object(bridge->handle, "_HPP", NULL, &buffer);
-
- if (status == AE_BUFFER_OVERFLOW) {
- buffer.pointer = kmalloc(buffer.length, GFP_KERNEL);
- if (!buffer.pointer)
- return;
- status = acpi_evaluate_object(bridge->handle, "_HPP", NULL, &buffer);
- }
-#else
status = acpi_evaluate_object(bridge->handle, "_HPP", NULL, &buffer);
-#endif
if (ACPI_FAILURE(status)) {
dbg("_HPP evaluation failed\n");
@@ -494,12 +476,8 @@
static void add_host_bridge (acpi_handle *handle, int seg, int bus)
{
acpi_status status;
-#if ACPI_CA_VERSION < 0x20020201
- acpi_buffer buffer;
-#else
struct acpi_buffer buffer = { .length = ACPI_ALLOCATE_BUFFER,
.pointer = NULL};
-#endif
struct acpiphp_bridge *bridge;
bridge = kmalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
@@ -522,22 +500,8 @@
/* decode resources */
-#if ACPI_CA_VERSION < 0x20020201
- buffer.length = 0;
- buffer.pointer = NULL;
-
status = acpi_get_current_resources(handle, &buffer);
- if (status == AE_BUFFER_OVERFLOW) {
- buffer.pointer = kmalloc(buffer.length, GFP_KERNEL);
- if (!buffer.pointer)
- return;
- status = acpi_get_current_resources(handle, &buffer);
- }
-#else
- status = acpi_get_current_resources(handle, &buffer);
-#endif
-
if (ACPI_FAILURE(status)) {
err("failed to decode bridge resources\n");
kfree(bridge);
@@ -819,7 +783,7 @@
struct list_head *l;
int retval = 0;
- /* is this already enabled? */
+ /* if already enabled, just skip */
if (slot->flags & SLOT_POWEREDON)
goto err_exit;
@@ -827,14 +791,14 @@
func = list_entry(l, struct acpiphp_func, sibling);
if (func->flags & FUNC_HAS_PS0) {
- dbg("%s: executing _PS0 on %s\n", __FUNCTION__,
- func->pci_dev->slot_name);
+ dbg("%s: executing _PS0\n", __FUNCTION__);
status = acpi_evaluate_object(func->handle, "_PS0", NULL, NULL);
if (ACPI_FAILURE(status)) {
warn("%s: _PS0 failed\n", __FUNCTION__);
retval = -1;
goto err_exit;
- }
+ } else
+ break;
}
}
@@ -857,20 +821,21 @@
int retval = 0;
- /* is this already enabled? */
+ /* if already disabled, just skip */
if ((slot->flags & SLOT_POWEREDON) == 0)
goto err_exit;
list_for_each (l, &slot->funcs) {
func = list_entry(l, struct acpiphp_func, sibling);
- if (func->flags & (FUNC_HAS_PS3 | FUNC_EXISTS)) {
+ if (func->pci_dev && (func->flags & FUNC_HAS_PS3)) {
status = acpi_evaluate_object(func->handle, "_PS3", NULL, NULL);
if (ACPI_FAILURE(status)) {
warn("%s: _PS3 failed\n", __FUNCTION__);
retval = -1;
goto err_exit;
- }
+ } else
+ break;
}
}
@@ -878,20 +843,19 @@
func = list_entry(l, struct acpiphp_func, sibling);
/* We don't want to call _EJ0 on non-existing functions. */
- if (func->flags & (FUNC_HAS_EJ0 | FUNC_EXISTS)) {
+ if (func->pci_dev && (func->flags & FUNC_HAS_EJ0)) {
/* _EJ0 method take one argument */
arg_list.count = 1;
arg_list.pointer = &arg;
arg.type = ACPI_TYPE_INTEGER;
arg.integer.value = 1;
-
status = acpi_evaluate_object(func->handle, "_EJ0", &arg_list, NULL);
if (ACPI_FAILURE(status)) {
warn("%s: _EJ0 failed\n", __FUNCTION__);
retval = -1;
goto err_exit;
- }
- func->flags &= (~FUNC_EXISTS);
+ } else
+ break;
}
}
@@ -973,8 +937,6 @@
retval = acpiphp_configure_function(func);
if (retval)
goto err_exit;
-
- func->flags |= FUNC_EXISTS;
}
slot->flags |= SLOT_ENABLED;
@@ -1003,15 +965,12 @@
list_for_each (l, &slot->funcs) {
func = list_entry(l, struct acpiphp_func, sibling);
- if (func->pci_dev) {
- if (acpiphp_unconfigure_function(func) == 0) {
- func->pci_dev = NULL;
- } else {
+ if (func->pci_dev)
+ if (acpiphp_unconfigure_function(func)) {
err("failed to unconfigure device\n");
retval = -1;
goto err_exit;
}
- }
}
slot->flags &= (~SLOT_ENABLED);
@@ -1391,7 +1350,7 @@
up(&slot->crit_sect);
goto err_exit;
}
- enabled++;
+ disabled++;
}
} else {
/* if disabled but present, enable */
@@ -1402,7 +1361,7 @@
up(&slot->crit_sect);
goto err_exit;
}
- disabled++;
+ enabled++;
}
}
}
@@ -1468,3 +1427,18 @@
return (sta == 0) ? 0 : 1;
}
+
+
+/*
+ * pci address (seg/bus/dev)
+ */
+u32 acpiphp_get_address (struct acpiphp_slot *slot)
+{
+ u32 address;
+
+ address = ((slot->bridge->seg) << 16) |
+ ((slot->bridge->bus) << 8) |
+ slot->device;
+
+ return address;
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)