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