aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_irq.c
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2008-12-08 23:30:15 -0500
committerLen Brown <len.brown@intel.com>2008-12-30 21:14:42 -0500
commit2320ac6cb078eec77bf93742895dc35e64fae124 (patch)
treef562e5993eae712b853a6013411d7a1c5c0eea74 /drivers/acpi/pci_irq.c
parent3b8249de43ecf05407888c1ca6ca6e4945ff823c (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/pci_irq.c')
-rw-r--r--drivers/acpi/pci_irq.c52
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
244int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus) 244int 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