diff options
Diffstat (limited to 'drivers/acpi/pci_slot.c')
-rw-r--r-- | drivers/acpi/pci_slot.c | 44 |
1 files changed, 10 insertions, 34 deletions
diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c index e50e31a518af..d22585f21aeb 100644 --- a/drivers/acpi/pci_slot.c +++ b/drivers/acpi/pci_slot.c | |||
@@ -67,8 +67,8 @@ struct acpi_pci_slot { | |||
67 | struct list_head list; /* node in the list of slots */ | 67 | struct list_head list; /* node in the list of slots */ |
68 | }; | 68 | }; |
69 | 69 | ||
70 | static int acpi_pci_slot_add(acpi_handle handle); | 70 | static int acpi_pci_slot_add(struct acpi_pci_root *root); |
71 | static void acpi_pci_slot_remove(acpi_handle handle); | 71 | static void acpi_pci_slot_remove(struct acpi_pci_root *root); |
72 | 72 | ||
73 | static LIST_HEAD(slot_list); | 73 | static LIST_HEAD(slot_list); |
74 | static DEFINE_MUTEX(slot_list_lock); | 74 | static DEFINE_MUTEX(slot_list_lock); |
@@ -233,45 +233,20 @@ out: | |||
233 | 233 | ||
234 | /* | 234 | /* |
235 | * walk_root_bridge - generic root bridge walker | 235 | * walk_root_bridge - generic root bridge walker |
236 | * @handle: points to an acpi_pci_root | 236 | * @root: poiner of an acpi_pci_root |
237 | * @user_function: user callback for slot objects | 237 | * @user_function: user callback for slot objects |
238 | * | 238 | * |
239 | * Call user_function for all objects underneath this root bridge. | 239 | * Call user_function for all objects underneath this root bridge. |
240 | * Walk p2p bridges underneath us and call user_function on those too. | 240 | * Walk p2p bridges underneath us and call user_function on those too. |
241 | */ | 241 | */ |
242 | static int | 242 | static int |
243 | walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function) | 243 | walk_root_bridge(struct acpi_pci_root *root, acpi_walk_callback user_function) |
244 | { | 244 | { |
245 | int seg, bus; | ||
246 | unsigned long long tmp; | ||
247 | acpi_status status; | 245 | acpi_status status; |
248 | acpi_handle dummy_handle; | 246 | acpi_handle handle = root->device->handle; |
249 | struct pci_bus *pci_bus; | 247 | struct pci_bus *pci_bus = root->bus; |
250 | struct callback_args context; | 248 | struct callback_args context; |
251 | 249 | ||
252 | /* If the bridge doesn't have _STA, we assume it is always there */ | ||
253 | status = acpi_get_handle(handle, "_STA", &dummy_handle); | ||
254 | if (ACPI_SUCCESS(status)) { | ||
255 | status = acpi_evaluate_integer(handle, "_STA", NULL, &tmp); | ||
256 | if (ACPI_FAILURE(status)) { | ||
257 | info("%s: _STA evaluation failure\n", __func__); | ||
258 | return 0; | ||
259 | } | ||
260 | if ((tmp & ACPI_STA_DEVICE_FUNCTIONING) == 0) | ||
261 | /* don't register this object */ | ||
262 | return 0; | ||
263 | } | ||
264 | |||
265 | status = acpi_evaluate_integer(handle, "_SEG", NULL, &tmp); | ||
266 | seg = ACPI_SUCCESS(status) ? tmp : 0; | ||
267 | |||
268 | status = acpi_evaluate_integer(handle, "_BBN", NULL, &tmp); | ||
269 | bus = ACPI_SUCCESS(status) ? tmp : 0; | ||
270 | |||
271 | pci_bus = pci_find_bus(seg, bus); | ||
272 | if (!pci_bus) | ||
273 | return 0; | ||
274 | |||
275 | context.pci_bus = pci_bus; | 250 | context.pci_bus = pci_bus; |
276 | context.user_function = user_function; | 251 | context.user_function = user_function; |
277 | context.root_handle = handle; | 252 | context.root_handle = handle; |
@@ -295,11 +270,11 @@ walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function) | |||
295 | * @handle: points to an acpi_pci_root | 270 | * @handle: points to an acpi_pci_root |
296 | */ | 271 | */ |
297 | static int | 272 | static int |
298 | acpi_pci_slot_add(acpi_handle handle) | 273 | acpi_pci_slot_add(struct acpi_pci_root *root) |
299 | { | 274 | { |
300 | acpi_status status; | 275 | acpi_status status; |
301 | 276 | ||
302 | status = walk_root_bridge(handle, register_slot); | 277 | status = walk_root_bridge(root, register_slot); |
303 | if (ACPI_FAILURE(status)) | 278 | if (ACPI_FAILURE(status)) |
304 | err("%s: register_slot failure - %d\n", __func__, status); | 279 | err("%s: register_slot failure - %d\n", __func__, status); |
305 | 280 | ||
@@ -311,10 +286,11 @@ acpi_pci_slot_add(acpi_handle handle) | |||
311 | * @handle: points to an acpi_pci_root | 286 | * @handle: points to an acpi_pci_root |
312 | */ | 287 | */ |
313 | static void | 288 | static void |
314 | acpi_pci_slot_remove(acpi_handle handle) | 289 | acpi_pci_slot_remove(struct acpi_pci_root *root) |
315 | { | 290 | { |
316 | struct acpi_pci_slot *slot, *tmp; | 291 | struct acpi_pci_slot *slot, *tmp; |
317 | struct pci_bus *pbus; | 292 | struct pci_bus *pbus; |
293 | acpi_handle handle = root->device->handle; | ||
318 | 294 | ||
319 | mutex_lock(&slot_list_lock); | 295 | mutex_lock(&slot_list_lock); |
320 | list_for_each_entry_safe(slot, tmp, &slot_list, list) { | 296 | list_for_each_entry_safe(slot, tmp, &slot_list, list) { |