diff options
author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2008-12-08 23:30:15 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-12-30 21:14:42 -0500 |
commit | 2320ac6cb078eec77bf93742895dc35e64fae124 (patch) | |
tree | f562e5993eae712b853a6013411d7a1c5c0eea74 /drivers/acpi | |
parent | 3b8249de43ecf05407888c1ca6ca6e4945ff823c (diff) |
ACPI: PCI: simplify buffer management for evaluating _PRT
Previously, acpi_pci_irq_add_prt() did all its own buffer management.
But now that we have ACPI_ALLOCATE_BUFFER, we no longer need to do
that management. And we don't have to call acpi_get_irq_routing_table()
twice (once to learn the size of the buffer needed, and again to
actually get the table).
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/pci_irq.c | 52 |
1 files changed, 12 insertions, 40 deletions
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 6c04060d063b..6a9f3ddb322e 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -243,55 +243,29 @@ acpi_pci_irq_del_entry(int segment, int bus, struct acpi_prt_entry *entry) | |||
243 | 243 | ||
244 | int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus) | 244 | int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus) |
245 | { | 245 | { |
246 | acpi_status status = AE_OK; | 246 | acpi_status status; |
247 | char *pathname = NULL; | 247 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
248 | struct acpi_buffer buffer = { 0, NULL }; | 248 | struct acpi_pci_routing_table *entry; |
249 | struct acpi_pci_routing_table *prt = NULL; | ||
250 | struct acpi_pci_routing_table *entry = NULL; | ||
251 | static int first_time = 1; | 249 | static int first_time = 1; |
252 | 250 | ||
253 | |||
254 | pathname = kzalloc(ACPI_PATHNAME_MAX, GFP_KERNEL); | ||
255 | if (!pathname) | ||
256 | return -ENOMEM; | ||
257 | |||
258 | if (first_time) { | 251 | if (first_time) { |
259 | acpi_prt.count = 0; | 252 | acpi_prt.count = 0; |
260 | INIT_LIST_HEAD(&acpi_prt.entries); | 253 | INIT_LIST_HEAD(&acpi_prt.entries); |
261 | first_time = 0; | 254 | first_time = 0; |
262 | } | 255 | } |
263 | 256 | ||
264 | /* | 257 | /* 'handle' is the _PRT's parent (root bridge or PCI-PCI bridge) */ |
265 | * NOTE: We're given a 'handle' to the _PRT object's parent device | 258 | status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); |
266 | * (either a PCI root bridge or PCI-PCI bridge). | 259 | if (ACPI_FAILURE(status)) |
267 | */ | 260 | return -ENODEV; |
268 | |||
269 | buffer.length = ACPI_PATHNAME_MAX; | ||
270 | buffer.pointer = pathname; | ||
271 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); | ||
272 | 261 | ||
273 | printk(KERN_DEBUG "ACPI: PCI Interrupt Routing Table [%s._PRT]\n", | 262 | printk(KERN_DEBUG "ACPI: PCI Interrupt Routing Table [%s._PRT]\n", |
274 | pathname); | 263 | (char *) buffer.pointer); |
275 | 264 | ||
276 | /* | 265 | kfree(buffer.pointer); |
277 | * Evaluate this _PRT and add its entries to our global list (acpi_prt). | ||
278 | */ | ||
279 | 266 | ||
280 | buffer.length = 0; | 267 | buffer.length = ACPI_ALLOCATE_BUFFER; |
281 | buffer.pointer = NULL; | 268 | buffer.pointer = NULL; |
282 | kfree(pathname); | ||
283 | status = acpi_get_irq_routing_table(handle, &buffer); | ||
284 | if (status != AE_BUFFER_OVERFLOW) { | ||
285 | ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRT [%s]", | ||
286 | acpi_format_exception(status))); | ||
287 | return -ENODEV; | ||
288 | } | ||
289 | |||
290 | prt = kzalloc(buffer.length, GFP_KERNEL); | ||
291 | if (!prt) { | ||
292 | return -ENOMEM; | ||
293 | } | ||
294 | buffer.pointer = prt; | ||
295 | 269 | ||
296 | status = acpi_get_irq_routing_table(handle, &buffer); | 270 | status = acpi_get_irq_routing_table(handle, &buffer); |
297 | if (ACPI_FAILURE(status)) { | 271 | if (ACPI_FAILURE(status)) { |
@@ -301,16 +275,14 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus) | |||
301 | return -ENODEV; | 275 | return -ENODEV; |
302 | } | 276 | } |
303 | 277 | ||
304 | entry = prt; | 278 | entry = buffer.pointer; |
305 | |||
306 | while (entry && (entry->length > 0)) { | 279 | while (entry && (entry->length > 0)) { |
307 | acpi_pci_irq_add_entry(handle, segment, bus, entry); | 280 | acpi_pci_irq_add_entry(handle, segment, bus, entry); |
308 | entry = (struct acpi_pci_routing_table *) | 281 | entry = (struct acpi_pci_routing_table *) |
309 | ((unsigned long)entry + entry->length); | 282 | ((unsigned long)entry + entry->length); |
310 | } | 283 | } |
311 | 284 | ||
312 | kfree(prt); | 285 | kfree(buffer.pointer); |
313 | |||
314 | return 0; | 286 | return 0; |
315 | } | 287 | } |
316 | 288 | ||