aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/pci_irq.c')
-rw-r--r--drivers/acpi/pci_irq.c91
1 files changed, 40 insertions, 51 deletions
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index ed3f226677aa..feda0341f5a7 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -54,10 +54,9 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(int segment,
54 struct list_head *node = NULL; 54 struct list_head *node = NULL;
55 struct acpi_prt_entry *entry = NULL; 55 struct acpi_prt_entry *entry = NULL;
56 56
57 ACPI_FUNCTION_TRACE("acpi_pci_irq_find_prt_entry");
58 57
59 if (!acpi_prt.count) 58 if (!acpi_prt.count)
60 return_PTR(NULL); 59 return NULL;
61 60
62 /* 61 /*
63 * Parse through all PRT entries looking for a match on the specified 62 * Parse through all PRT entries looking for a match on the specified
@@ -72,12 +71,12 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(int segment,
72 && (device == entry->id.device) 71 && (device == entry->id.device)
73 && (pin == entry->pin)) { 72 && (pin == entry->pin)) {
74 spin_unlock(&acpi_prt_lock); 73 spin_unlock(&acpi_prt_lock);
75 return_PTR(entry); 74 return entry;
76 } 75 }
77 } 76 }
78 77
79 spin_unlock(&acpi_prt_lock); 78 spin_unlock(&acpi_prt_lock);
80 return_PTR(NULL); 79 return NULL;
81} 80}
82 81
83static int 82static int
@@ -86,14 +85,13 @@ acpi_pci_irq_add_entry(acpi_handle handle,
86{ 85{
87 struct acpi_prt_entry *entry = NULL; 86 struct acpi_prt_entry *entry = NULL;
88 87
89 ACPI_FUNCTION_TRACE("acpi_pci_irq_add_entry");
90 88
91 if (!prt) 89 if (!prt)
92 return_VALUE(-EINVAL); 90 return -EINVAL;
93 91
94 entry = kmalloc(sizeof(struct acpi_prt_entry), GFP_KERNEL); 92 entry = kmalloc(sizeof(struct acpi_prt_entry), GFP_KERNEL);
95 if (!entry) 93 if (!entry)
96 return_VALUE(-ENOMEM); 94 return -ENOMEM;
97 memset(entry, 0, sizeof(struct acpi_prt_entry)); 95 memset(entry, 0, sizeof(struct acpi_prt_entry));
98 96
99 entry->id.segment = segment; 97 entry->id.segment = segment;
@@ -140,7 +138,7 @@ acpi_pci_irq_add_entry(acpi_handle handle,
140 acpi_prt.count++; 138 acpi_prt.count++;
141 spin_unlock(&acpi_prt_lock); 139 spin_unlock(&acpi_prt_lock);
142 140
143 return_VALUE(0); 141 return 0;
144} 142}
145 143
146static void 144static void
@@ -162,11 +160,10 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus)
162 struct acpi_pci_routing_table *entry = NULL; 160 struct acpi_pci_routing_table *entry = NULL;
163 static int first_time = 1; 161 static int first_time = 1;
164 162
165 ACPI_FUNCTION_TRACE("acpi_pci_irq_add_prt");
166 163
167 pathname = (char *)kmalloc(ACPI_PATHNAME_MAX, GFP_KERNEL); 164 pathname = (char *)kmalloc(ACPI_PATHNAME_MAX, GFP_KERNEL);
168 if (!pathname) 165 if (!pathname)
169 return_VALUE(-ENOMEM); 166 return -ENOMEM;
170 memset(pathname, 0, ACPI_PATHNAME_MAX); 167 memset(pathname, 0, ACPI_PATHNAME_MAX);
171 168
172 if (first_time) { 169 if (first_time) {
@@ -196,24 +193,24 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus)
196 kfree(pathname); 193 kfree(pathname);
197 status = acpi_get_irq_routing_table(handle, &buffer); 194 status = acpi_get_irq_routing_table(handle, &buffer);
198 if (status != AE_BUFFER_OVERFLOW) { 195 if (status != AE_BUFFER_OVERFLOW) {
199 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PRT [%s]\n", 196 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRT [%s]",
200 acpi_format_exception(status))); 197 acpi_format_exception(status)));
201 return_VALUE(-ENODEV); 198 return -ENODEV;
202 } 199 }
203 200
204 prt = kmalloc(buffer.length, GFP_KERNEL); 201 prt = kmalloc(buffer.length, GFP_KERNEL);
205 if (!prt) { 202 if (!prt) {
206 return_VALUE(-ENOMEM); 203 return -ENOMEM;
207 } 204 }
208 memset(prt, 0, buffer.length); 205 memset(prt, 0, buffer.length);
209 buffer.pointer = prt; 206 buffer.pointer = prt;
210 207
211 status = acpi_get_irq_routing_table(handle, &buffer); 208 status = acpi_get_irq_routing_table(handle, &buffer);
212 if (ACPI_FAILURE(status)) { 209 if (ACPI_FAILURE(status)) {
213 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PRT [%s]\n", 210 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRT [%s]",
214 acpi_format_exception(status))); 211 acpi_format_exception(status)));
215 kfree(buffer.pointer); 212 kfree(buffer.pointer);
216 return_VALUE(-ENODEV); 213 return -ENODEV;
217 } 214 }
218 215
219 entry = prt; 216 entry = prt;
@@ -226,7 +223,7 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus)
226 223
227 kfree(prt); 224 kfree(prt);
228 225
229 return_VALUE(0); 226 return 0;
230} 227}
231 228
232void acpi_pci_irq_del_prt(int segment, int bus) 229void acpi_pci_irq_del_prt(int segment, int bus)
@@ -261,16 +258,15 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
261{ 258{
262 int irq; 259 int irq;
263 260
264 ACPI_FUNCTION_TRACE("acpi_pci_allocate_irq");
265 261
266 if (entry->link.handle) { 262 if (entry->link.handle) {
267 irq = acpi_pci_link_allocate_irq(entry->link.handle, 263 irq = acpi_pci_link_allocate_irq(entry->link.handle,
268 entry->link.index, triggering, 264 entry->link.index, triggering,
269 polarity, link); 265 polarity, link);
270 if (irq < 0) { 266 if (irq < 0) {
271 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 267 printk(KERN_WARNING PREFIX
272 "Invalid IRQ link routing entry\n")); 268 "Invalid IRQ link routing entry\n");
273 return_VALUE(-1); 269 return -1;
274 } 270 }
275 } else { 271 } else {
276 irq = entry->link.index; 272 irq = entry->link.index;
@@ -279,7 +275,7 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
279 } 275 }
280 276
281 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq)); 277 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq));
282 return_VALUE(irq); 278 return irq;
283} 279}
284 280
285static int 281static int
@@ -288,13 +284,12 @@ acpi_pci_free_irq(struct acpi_prt_entry *entry,
288{ 284{
289 int irq; 285 int irq;
290 286
291 ACPI_FUNCTION_TRACE("acpi_pci_free_irq");
292 if (entry->link.handle) { 287 if (entry->link.handle) {
293 irq = acpi_pci_link_free_irq(entry->link.handle); 288 irq = acpi_pci_link_free_irq(entry->link.handle);
294 } else { 289 } else {
295 irq = entry->link.index; 290 irq = entry->link.index;
296 } 291 }
297 return_VALUE(irq); 292 return irq;
298} 293}
299 294
300/* 295/*
@@ -314,7 +309,6 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
314 int bus_nr = bus->number; 309 int bus_nr = bus->number;
315 int ret; 310 int ret;
316 311
317 ACPI_FUNCTION_TRACE("acpi_pci_irq_lookup");
318 312
319 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 313 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
320 "Searching for PRT entry for %02x:%02x:%02x[%c]\n", 314 "Searching for PRT entry for %02x:%02x:%02x[%c]\n",
@@ -323,11 +317,11 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
323 entry = acpi_pci_irq_find_prt_entry(segment, bus_nr, device, pin); 317 entry = acpi_pci_irq_find_prt_entry(segment, bus_nr, device, pin);
324 if (!entry) { 318 if (!entry) {
325 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "PRT entry not found\n")); 319 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "PRT entry not found\n"));
326 return_VALUE(-1); 320 return -1;
327 } 321 }
328 322
329 ret = func(entry, triggering, polarity, link); 323 ret = func(entry, triggering, polarity, link);
330 return_VALUE(ret); 324 return ret;
331} 325}
332 326
333/* 327/*
@@ -345,10 +339,9 @@ acpi_pci_irq_derive(struct pci_dev *dev,
345 int irq = -1; 339 int irq = -1;
346 u8 bridge_pin = 0; 340 u8 bridge_pin = 0;
347 341
348 ACPI_FUNCTION_TRACE("acpi_pci_irq_derive");
349 342
350 if (!dev) 343 if (!dev)
351 return_VALUE(-EINVAL); 344 return -EINVAL;
352 345
353 /* 346 /*
354 * Attempt to derive an IRQ for this device from a parent bridge's 347 * Attempt to derive an IRQ for this device from a parent bridge's
@@ -365,7 +358,7 @@ acpi_pci_irq_derive(struct pci_dev *dev,
365 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 358 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
366 "No interrupt pin configured for device %s\n", 359 "No interrupt pin configured for device %s\n",
367 pci_name(bridge))); 360 pci_name(bridge)));
368 return_VALUE(-1); 361 return -1;
369 } 362 }
370 /* Pin is from 0 to 3 */ 363 /* Pin is from 0 to 3 */
371 bridge_pin--; 364 bridge_pin--;
@@ -378,16 +371,15 @@ acpi_pci_irq_derive(struct pci_dev *dev,
378 } 371 }
379 372
380 if (irq < 0) { 373 if (irq < 0) {
381 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 374 printk(KERN_WARNING PREFIX "Unable to derive IRQ for device %s\n",
382 "Unable to derive IRQ for device %s\n", 375 pci_name(dev));
383 pci_name(dev))); 376 return -1;
384 return_VALUE(-1);
385 } 377 }
386 378
387 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Derive IRQ %d for device %s from %s\n", 379 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Derive IRQ %d for device %s from %s\n",
388 irq, pci_name(dev), pci_name(bridge))); 380 irq, pci_name(dev), pci_name(bridge)));
389 381
390 return_VALUE(irq); 382 return irq;
391} 383}
392 384
393/* 385/*
@@ -405,24 +397,22 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
405 char *link = NULL; 397 char *link = NULL;
406 int rc; 398 int rc;
407 399
408 ACPI_FUNCTION_TRACE("acpi_pci_irq_enable");
409 400
410 if (!dev) 401 if (!dev)
411 return_VALUE(-EINVAL); 402 return -EINVAL;
412 403
413 pin = dev->pin; 404 pin = dev->pin;
414 if (!pin) { 405 if (!pin) {
415 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 406 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
416 "No interrupt pin configured for device %s\n", 407 "No interrupt pin configured for device %s\n",
417 pci_name(dev))); 408 pci_name(dev)));
418 return_VALUE(0); 409 return 0;
419 } 410 }
420 pin--; 411 pin--;
421 412
422 if (!dev->bus) { 413 if (!dev->bus) {
423 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 414 printk(KERN_ERR PREFIX "Invalid (NULL) 'bus' field\n");
424 "Invalid (NULL) 'bus' field\n")); 415 return -ENODEV;
425 return_VALUE(-ENODEV);
426 } 416 }
427 417
428 /* 418 /*
@@ -454,10 +444,10 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
454 printk(" - using IRQ %d\n", dev->irq); 444 printk(" - using IRQ %d\n", dev->irq);
455 acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, 445 acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE,
456 ACPI_ACTIVE_LOW); 446 ACPI_ACTIVE_LOW);
457 return_VALUE(0); 447 return 0;
458 } else { 448 } else {
459 printk("\n"); 449 printk("\n");
460 return_VALUE(0); 450 return 0;
461 } 451 }
462 } 452 }
463 453
@@ -465,7 +455,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
465 if (rc < 0) { 455 if (rc < 0) {
466 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed " 456 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed "
467 "to register GSI\n", pci_name(dev), ('A' + pin)); 457 "to register GSI\n", pci_name(dev), ('A' + pin));
468 return_VALUE(rc); 458 return rc;
469 } 459 }
470 dev->irq = rc; 460 dev->irq = rc;
471 461
@@ -479,7 +469,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
479 (triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge", 469 (triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge",
480 (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq); 470 (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq);
481 471
482 return_VALUE(0); 472 return 0;
483} 473}
484 474
485EXPORT_SYMBOL(acpi_pci_irq_enable); 475EXPORT_SYMBOL(acpi_pci_irq_enable);
@@ -496,14 +486,13 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
496 int triggering = ACPI_LEVEL_SENSITIVE; 486 int triggering = ACPI_LEVEL_SENSITIVE;
497 int polarity = ACPI_ACTIVE_LOW; 487 int polarity = ACPI_ACTIVE_LOW;
498 488
499 ACPI_FUNCTION_TRACE("acpi_pci_irq_disable");
500 489
501 if (!dev || !dev->bus) 490 if (!dev || !dev->bus)
502 return_VOID; 491 return;
503 492
504 pin = dev->pin; 493 pin = dev->pin;
505 if (!pin) 494 if (!pin)
506 return_VOID; 495 return;
507 pin--; 496 pin--;
508 497
509 /* 498 /*
@@ -521,7 +510,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
521 &triggering, &polarity, NULL, 510 &triggering, &polarity, NULL,
522 acpi_pci_free_irq); 511 acpi_pci_free_irq);
523 if (gsi < 0) 512 if (gsi < 0)
524 return_VOID; 513 return;
525 514
526 /* 515 /*
527 * TBD: It might be worth clearing dev->irq by magic constant 516 * TBD: It might be worth clearing dev->irq by magic constant
@@ -533,5 +522,5 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
533 522
534 acpi_unregister_gsi(gsi); 523 acpi_unregister_gsi(gsi);
535 524
536 return_VOID; 525 return;
537} 526}