aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_link.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/pci_link.c')
-rw-r--r--drivers/acpi/pci_link.c211
1 files changed, 89 insertions, 122 deletions
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 228bdb626502..7f3e7e77e794 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -83,7 +83,6 @@ struct acpi_pci_link_irq {
83struct acpi_pci_link { 83struct acpi_pci_link {
84 struct list_head node; 84 struct list_head node;
85 struct acpi_device *device; 85 struct acpi_device *device;
86 acpi_handle handle;
87 struct acpi_pci_link_irq irq; 86 struct acpi_pci_link_irq irq;
88 int refcnt; 87 int refcnt;
89}; 88};
@@ -107,26 +106,23 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
107 struct acpi_pci_link *link = (struct acpi_pci_link *)context; 106 struct acpi_pci_link *link = (struct acpi_pci_link *)context;
108 u32 i = 0; 107 u32 i = 0;
109 108
110 ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible");
111 109
112 switch (resource->type) { 110 switch (resource->type) {
113 case ACPI_RESOURCE_TYPE_START_DEPENDENT: 111 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
114 return_ACPI_STATUS(AE_OK); 112 return AE_OK;
115 case ACPI_RESOURCE_TYPE_IRQ: 113 case ACPI_RESOURCE_TYPE_IRQ:
116 { 114 {
117 struct acpi_resource_irq *p = &resource->data.irq; 115 struct acpi_resource_irq *p = &resource->data.irq;
118 if (!p || !p->interrupt_count) { 116 if (!p || !p->interrupt_count) {
119 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 117 printk(KERN_WARNING PREFIX "Blank IRQ resource\n");
120 "Blank IRQ resource\n")); 118 return AE_OK;
121 return_ACPI_STATUS(AE_OK);
122 } 119 }
123 for (i = 0; 120 for (i = 0;
124 (i < p->interrupt_count 121 (i < p->interrupt_count
125 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 122 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
126 if (!p->interrupts[i]) { 123 if (!p->interrupts[i]) {
127 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 124 printk(KERN_WARNING PREFIX "Invalid IRQ %d\n",
128 "Invalid IRQ %d\n", 125 p->interrupts[i]);
129 p->interrupts[i]));
130 continue; 126 continue;
131 } 127 }
132 link->irq.possible[i] = p->interrupts[i]; 128 link->irq.possible[i] = p->interrupts[i];
@@ -142,17 +138,16 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
142 struct acpi_resource_extended_irq *p = 138 struct acpi_resource_extended_irq *p =
143 &resource->data.extended_irq; 139 &resource->data.extended_irq;
144 if (!p || !p->interrupt_count) { 140 if (!p || !p->interrupt_count) {
145 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 141 printk(KERN_WARNING PREFIX
146 "Blank EXT IRQ resource\n")); 142 "Blank EXT IRQ resource\n");
147 return_ACPI_STATUS(AE_OK); 143 return AE_OK;
148 } 144 }
149 for (i = 0; 145 for (i = 0;
150 (i < p->interrupt_count 146 (i < p->interrupt_count
151 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 147 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
152 if (!p->interrupts[i]) { 148 if (!p->interrupts[i]) {
153 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 149 printk(KERN_WARNING PREFIX "Invalid IRQ %d\n",
154 "Invalid IRQ %d\n", 150 p->interrupts[i]);
155 p->interrupts[i]));
156 continue; 151 continue;
157 } 152 }
158 link->irq.possible[i] = p->interrupts[i]; 153 link->irq.possible[i] = p->interrupts[i];
@@ -164,35 +159,33 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
164 break; 159 break;
165 } 160 }
166 default: 161 default:
167 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 162 printk(KERN_ERR PREFIX "Resource is not an IRQ entry\n");
168 "Resource is not an IRQ entry\n")); 163 return AE_OK;
169 return_ACPI_STATUS(AE_OK);
170 } 164 }
171 165
172 return_ACPI_STATUS(AE_CTRL_TERMINATE); 166 return AE_CTRL_TERMINATE;
173} 167}
174 168
175static int acpi_pci_link_get_possible(struct acpi_pci_link *link) 169static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
176{ 170{
177 acpi_status status; 171 acpi_status status;
178 172
179 ACPI_FUNCTION_TRACE("acpi_pci_link_get_possible");
180 173
181 if (!link) 174 if (!link)
182 return_VALUE(-EINVAL); 175 return -EINVAL;
183 176
184 status = acpi_walk_resources(link->handle, METHOD_NAME__PRS, 177 status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS,
185 acpi_pci_link_check_possible, link); 178 acpi_pci_link_check_possible, link);
186 if (ACPI_FAILURE(status)) { 179 if (ACPI_FAILURE(status)) {
187 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PRS\n")); 180 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRS"));
188 return_VALUE(-ENODEV); 181 return -ENODEV;
189 } 182 }
190 183
191 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 184 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
192 "Found %d possible IRQs\n", 185 "Found %d possible IRQs\n",
193 link->irq.possible_count)); 186 link->irq.possible_count));
194 187
195 return_VALUE(0); 188 return 0;
196} 189}
197 190
198static acpi_status 191static acpi_status
@@ -200,7 +193,6 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
200{ 193{
201 int *irq = (int *)context; 194 int *irq = (int *)context;
202 195
203 ACPI_FUNCTION_TRACE("acpi_pci_link_check_current");
204 196
205 switch (resource->type) { 197 switch (resource->type) {
206 case ACPI_RESOURCE_TYPE_IRQ: 198 case ACPI_RESOURCE_TYPE_IRQ:
@@ -213,7 +205,7 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
213 */ 205 */
214 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 206 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
215 "Blank IRQ resource\n")); 207 "Blank IRQ resource\n"));
216 return_ACPI_STATUS(AE_OK); 208 return AE_OK;
217 } 209 }
218 *irq = p->interrupts[0]; 210 *irq = p->interrupts[0];
219 break; 211 break;
@@ -227,20 +219,20 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
227 * extended IRQ descriptors must 219 * extended IRQ descriptors must
228 * return at least 1 IRQ 220 * return at least 1 IRQ
229 */ 221 */
230 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 222 printk(KERN_WARNING PREFIX
231 "Blank EXT IRQ resource\n")); 223 "Blank EXT IRQ resource\n");
232 return_ACPI_STATUS(AE_OK); 224 return AE_OK;
233 } 225 }
234 *irq = p->interrupts[0]; 226 *irq = p->interrupts[0];
235 break; 227 break;
236 } 228 }
237 break; 229 break;
238 default: 230 default:
239 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Resource %d isn't an IRQ\n", resource->type)); 231 printk(KERN_ERR PREFIX "Resource %d isn't an IRQ\n", resource->type);
240 case ACPI_RESOURCE_TYPE_END_TAG: 232 case ACPI_RESOURCE_TYPE_END_TAG:
241 return_ACPI_STATUS(AE_OK); 233 return AE_OK;
242 } 234 }
243 return_ACPI_STATUS(AE_CTRL_TERMINATE); 235 return AE_CTRL_TERMINATE;
244} 236}
245 237
246/* 238/*
@@ -256,10 +248,8 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
256 acpi_status status = AE_OK; 248 acpi_status status = AE_OK;
257 int irq = 0; 249 int irq = 0;
258 250
259 ACPI_FUNCTION_TRACE("acpi_pci_link_get_current"); 251 if (!link)
260 252 return -EINVAL;
261 if (!link || !link->handle)
262 return_VALUE(-EINVAL);
263 253
264 link->irq.active = 0; 254 link->irq.active = 0;
265 255
@@ -268,14 +258,13 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
268 /* Query _STA, set link->device->status */ 258 /* Query _STA, set link->device->status */
269 result = acpi_bus_get_status(link->device); 259 result = acpi_bus_get_status(link->device);
270 if (result) { 260 if (result) {
271 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 261 printk(KERN_ERR PREFIX "Unable to read status\n");
272 "Unable to read status\n"));
273 goto end; 262 goto end;
274 } 263 }
275 264
276 if (!link->device->status.enabled) { 265 if (!link->device->status.enabled) {
277 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link disabled\n")); 266 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link disabled\n"));
278 return_VALUE(0); 267 return 0;
279 } 268 }
280 } 269 }
281 270
@@ -283,16 +272,16 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
283 * Query and parse _CRS to get the current IRQ assignment. 272 * Query and parse _CRS to get the current IRQ assignment.
284 */ 273 */
285 274
286 status = acpi_walk_resources(link->handle, METHOD_NAME__CRS, 275 status = acpi_walk_resources(link->device->handle, METHOD_NAME__CRS,
287 acpi_pci_link_check_current, &irq); 276 acpi_pci_link_check_current, &irq);
288 if (ACPI_FAILURE(status)) { 277 if (ACPI_FAILURE(status)) {
289 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _CRS\n")); 278 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _CRS"));
290 result = -ENODEV; 279 result = -ENODEV;
291 goto end; 280 goto end;
292 } 281 }
293 282
294 if (acpi_strict && !irq) { 283 if (acpi_strict && !irq) {
295 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "_CRS returned 0\n")); 284 printk(KERN_ERR PREFIX "_CRS returned 0\n");
296 result = -ENODEV; 285 result = -ENODEV;
297 } 286 }
298 287
@@ -301,7 +290,7 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
301 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active)); 290 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active));
302 291
303 end: 292 end:
304 return_VALUE(result); 293 return result;
305} 294}
306 295
307static int acpi_pci_link_set(struct acpi_pci_link *link, int irq) 296static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
@@ -314,14 +303,13 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
314 } *resource; 303 } *resource;
315 struct acpi_buffer buffer = { 0, NULL }; 304 struct acpi_buffer buffer = { 0, NULL };
316 305
317 ACPI_FUNCTION_TRACE("acpi_pci_link_set");
318 306
319 if (!link || !irq) 307 if (!link || !irq)
320 return_VALUE(-EINVAL); 308 return -EINVAL;
321 309
322 resource = kmalloc(sizeof(*resource) + 1, GFP_ATOMIC); 310 resource = kmalloc(sizeof(*resource) + 1, GFP_ATOMIC);
323 if (!resource) 311 if (!resource)
324 return_VALUE(-ENOMEM); 312 return -ENOMEM;
325 313
326 memset(resource, 0, sizeof(*resource) + 1); 314 memset(resource, 0, sizeof(*resource) + 1);
327 buffer.length = sizeof(*resource) + 1; 315 buffer.length = sizeof(*resource) + 1;
@@ -362,7 +350,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
362 /* ignore resource_source, it's optional */ 350 /* ignore resource_source, it's optional */
363 break; 351 break;
364 default: 352 default:
365 printk("ACPI BUG: resource_type %d\n", link->irq.resource_type); 353 printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type);
366 result = -EINVAL; 354 result = -EINVAL;
367 goto end; 355 goto end;
368 356
@@ -370,11 +358,11 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
370 resource->end.type = ACPI_RESOURCE_TYPE_END_TAG; 358 resource->end.type = ACPI_RESOURCE_TYPE_END_TAG;
371 359
372 /* Attempt to set the resource */ 360 /* Attempt to set the resource */
373 status = acpi_set_current_resources(link->handle, &buffer); 361 status = acpi_set_current_resources(link->device->handle, &buffer);
374 362
375 /* check for total failure */ 363 /* check for total failure */
376 if (ACPI_FAILURE(status)) { 364 if (ACPI_FAILURE(status)) {
377 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n")); 365 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _SRS"));
378 result = -ENODEV; 366 result = -ENODEV;
379 goto end; 367 goto end;
380 } 368 }
@@ -382,14 +370,14 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
382 /* Query _STA, set device->status */ 370 /* Query _STA, set device->status */
383 result = acpi_bus_get_status(link->device); 371 result = acpi_bus_get_status(link->device);
384 if (result) { 372 if (result) {
385 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unable to read status\n")); 373 printk(KERN_ERR PREFIX "Unable to read status\n");
386 goto end; 374 goto end;
387 } 375 }
388 if (!link->device->status.enabled) { 376 if (!link->device->status.enabled) {
389 printk(KERN_WARNING PREFIX 377 printk(KERN_WARNING PREFIX
390 "%s [%s] disabled and referenced, BIOS bug.\n", 378 "%s [%s] disabled and referenced, BIOS bug\n",
391 acpi_device_name(link->device), 379 acpi_device_name(link->device),
392 acpi_device_bid(link->device)); 380 acpi_device_bid(link->device));
393 } 381 }
394 382
395 /* Query _CRS, set link->irq.active */ 383 /* Query _CRS, set link->irq.active */
@@ -408,9 +396,9 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
408 * assume _SRS worked and override _CRS value. 396 * assume _SRS worked and override _CRS value.
409 */ 397 */
410 printk(KERN_WARNING PREFIX 398 printk(KERN_WARNING PREFIX
411 "%s [%s] BIOS reported IRQ %d, using IRQ %d\n", 399 "%s [%s] BIOS reported IRQ %d, using IRQ %d\n",
412 acpi_device_name(link->device), 400 acpi_device_name(link->device),
413 acpi_device_bid(link->device), link->irq.active, irq); 401 acpi_device_bid(link->device), link->irq.active, irq);
414 link->irq.active = irq; 402 link->irq.active = irq;
415 } 403 }
416 404
@@ -418,7 +406,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
418 406
419 end: 407 end:
420 kfree(resource); 408 kfree(resource);
421 return_VALUE(result); 409 return result;
422} 410}
423 411
424/* -------------------------------------------------------------------------- 412/* --------------------------------------------------------------------------
@@ -492,7 +480,6 @@ int __init acpi_irq_penalty_init(void)
492 struct acpi_pci_link *link = NULL; 480 struct acpi_pci_link *link = NULL;
493 int i = 0; 481 int i = 0;
494 482
495 ACPI_FUNCTION_TRACE("acpi_irq_penalty_init");
496 483
497 /* 484 /*
498 * Update penalties to facilitate IRQ balancing. 485 * Update penalties to facilitate IRQ balancing.
@@ -501,8 +488,7 @@ int __init acpi_irq_penalty_init(void)
501 488
502 link = list_entry(node, struct acpi_pci_link, node); 489 link = list_entry(node, struct acpi_pci_link, node);
503 if (!link) { 490 if (!link) {
504 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 491 printk(KERN_ERR PREFIX "Invalid link context\n");
505 "Invalid link context\n"));
506 continue; 492 continue;
507 } 493 }
508 494
@@ -530,7 +516,7 @@ int __init acpi_irq_penalty_init(void)
530 /* Add a penalty for the SCI */ 516 /* Add a penalty for the SCI */
531 acpi_irq_penalty[acpi_fadt.sci_int] += PIRQ_PENALTY_PCI_USING; 517 acpi_irq_penalty[acpi_fadt.sci_int] += PIRQ_PENALTY_PCI_USING;
532 518
533 return_VALUE(0); 519 return 0;
534} 520}
535 521
536static int acpi_irq_balance; /* 0: static, 1: balance */ 522static int acpi_irq_balance; /* 0: static, 1: balance */
@@ -540,13 +526,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
540 int irq; 526 int irq;
541 int i; 527 int i;
542 528
543 ACPI_FUNCTION_TRACE("acpi_pci_link_allocate");
544 529
545 if (link->irq.initialized) { 530 if (link->irq.initialized) {
546 if (link->refcnt == 0) 531 if (link->refcnt == 0)
547 /* This means the link is disabled but initialized */ 532 /* This means the link is disabled but initialized */
548 acpi_pci_link_set(link, link->irq.active); 533 acpi_pci_link_set(link, link->irq.active);
549 return_VALUE(0); 534 return 0;
550 } 535 }
551 536
552 /* 537 /*
@@ -562,7 +547,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
562 if (i == link->irq.possible_count) { 547 if (i == link->irq.possible_count) {
563 if (acpi_strict) 548 if (acpi_strict)
564 printk(KERN_WARNING PREFIX "_CRS %d not found" 549 printk(KERN_WARNING PREFIX "_CRS %d not found"
565 " in _PRS\n", link->irq.active); 550 " in _PRS\n", link->irq.active);
566 link->irq.active = 0; 551 link->irq.active = 0;
567 } 552 }
568 553
@@ -589,12 +574,11 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
589 574
590 /* Attempt to enable the link device at this IRQ. */ 575 /* Attempt to enable the link device at this IRQ. */
591 if (acpi_pci_link_set(link, irq)) { 576 if (acpi_pci_link_set(link, irq)) {
592 printk(PREFIX 577 printk(KERN_ERR PREFIX "Unable to set IRQ for %s [%s]. "
593 "Unable to set IRQ for %s [%s] (likely buggy ACPI BIOS).\n" 578 "Try pci=noacpi or acpi=off\n",
594 "Try pci=noacpi or acpi=off\n", 579 acpi_device_name(link->device),
595 acpi_device_name(link->device), 580 acpi_device_bid(link->device));
596 acpi_device_bid(link->device)); 581 return -ENODEV;
597 return_VALUE(-ENODEV);
598 } else { 582 } else {
599 acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING; 583 acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
600 printk(PREFIX "%s [%s] enabled at IRQ %d\n", 584 printk(PREFIX "%s [%s] enabled at IRQ %d\n",
@@ -604,7 +588,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
604 588
605 link->irq.initialized = 1; 589 link->irq.initialized = 1;
606 590
607 return_VALUE(0); 591 return 0;
608} 592}
609 593
610/* 594/*
@@ -622,36 +606,35 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
622 struct acpi_device *device = NULL; 606 struct acpi_device *device = NULL;
623 struct acpi_pci_link *link = NULL; 607 struct acpi_pci_link *link = NULL;
624 608
625 ACPI_FUNCTION_TRACE("acpi_pci_link_allocate_irq");
626 609
627 result = acpi_bus_get_device(handle, &device); 610 result = acpi_bus_get_device(handle, &device);
628 if (result) { 611 if (result) {
629 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link device\n")); 612 printk(KERN_ERR PREFIX "Invalid link device\n");
630 return_VALUE(-1); 613 return -1;
631 } 614 }
632 615
633 link = (struct acpi_pci_link *)acpi_driver_data(device); 616 link = (struct acpi_pci_link *)acpi_driver_data(device);
634 if (!link) { 617 if (!link) {
635 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link context\n")); 618 printk(KERN_ERR PREFIX "Invalid link context\n");
636 return_VALUE(-1); 619 return -1;
637 } 620 }
638 621
639 /* TBD: Support multiple index (IRQ) entries per Link Device */ 622 /* TBD: Support multiple index (IRQ) entries per Link Device */
640 if (index) { 623 if (index) {
641 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid index %d\n", index)); 624 printk(KERN_ERR PREFIX "Invalid index %d\n", index);
642 return_VALUE(-1); 625 return -1;
643 } 626 }
644 627
645 mutex_lock(&acpi_link_lock); 628 mutex_lock(&acpi_link_lock);
646 if (acpi_pci_link_allocate(link)) { 629 if (acpi_pci_link_allocate(link)) {
647 mutex_unlock(&acpi_link_lock); 630 mutex_unlock(&acpi_link_lock);
648 return_VALUE(-1); 631 return -1;
649 } 632 }
650 633
651 if (!link->irq.active) { 634 if (!link->irq.active) {
652 mutex_unlock(&acpi_link_lock); 635 mutex_unlock(&acpi_link_lock);
653 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Link active IRQ is 0!\n")); 636 printk(KERN_ERR PREFIX "Link active IRQ is 0!\n");
654 return_VALUE(-1); 637 return -1;
655 } 638 }
656 link->refcnt++; 639 link->refcnt++;
657 mutex_unlock(&acpi_link_lock); 640 mutex_unlock(&acpi_link_lock);
@@ -665,7 +648,7 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
665 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 648 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
666 "Link %s is referenced\n", 649 "Link %s is referenced\n",
667 acpi_device_bid(link->device))); 650 acpi_device_bid(link->device)));
668 return_VALUE(link->irq.active); 651 return (link->irq.active);
669} 652}
670 653
671/* 654/*
@@ -678,25 +661,24 @@ int acpi_pci_link_free_irq(acpi_handle handle)
678 struct acpi_pci_link *link = NULL; 661 struct acpi_pci_link *link = NULL;
679 acpi_status result; 662 acpi_status result;
680 663
681 ACPI_FUNCTION_TRACE("acpi_pci_link_free_irq");
682 664
683 result = acpi_bus_get_device(handle, &device); 665 result = acpi_bus_get_device(handle, &device);
684 if (result) { 666 if (result) {
685 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link device\n")); 667 printk(KERN_ERR PREFIX "Invalid link device\n");
686 return_VALUE(-1); 668 return -1;
687 } 669 }
688 670
689 link = (struct acpi_pci_link *)acpi_driver_data(device); 671 link = (struct acpi_pci_link *)acpi_driver_data(device);
690 if (!link) { 672 if (!link) {
691 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link context\n")); 673 printk(KERN_ERR PREFIX "Invalid link context\n");
692 return_VALUE(-1); 674 return -1;
693 } 675 }
694 676
695 mutex_lock(&acpi_link_lock); 677 mutex_lock(&acpi_link_lock);
696 if (!link->irq.initialized) { 678 if (!link->irq.initialized) {
697 mutex_unlock(&acpi_link_lock); 679 mutex_unlock(&acpi_link_lock);
698 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Link isn't initialized\n")); 680 printk(KERN_ERR PREFIX "Link isn't initialized\n");
699 return_VALUE(-1); 681 return -1;
700 } 682 }
701#ifdef FUTURE_USE 683#ifdef FUTURE_USE
702 /* 684 /*
@@ -715,10 +697,10 @@ int acpi_pci_link_free_irq(acpi_handle handle)
715 acpi_device_bid(link->device))); 697 acpi_device_bid(link->device)));
716 698
717 if (link->refcnt == 0) { 699 if (link->refcnt == 0) {
718 acpi_ut_evaluate_object(link->handle, "_DIS", 0, NULL); 700 acpi_ut_evaluate_object(link->device->handle, "_DIS", 0, NULL);
719 } 701 }
720 mutex_unlock(&acpi_link_lock); 702 mutex_unlock(&acpi_link_lock);
721 return_VALUE(link->irq.active); 703 return (link->irq.active);
722} 704}
723 705
724/* -------------------------------------------------------------------------- 706/* --------------------------------------------------------------------------
@@ -732,18 +714,16 @@ static int acpi_pci_link_add(struct acpi_device *device)
732 int i = 0; 714 int i = 0;
733 int found = 0; 715 int found = 0;
734 716
735 ACPI_FUNCTION_TRACE("acpi_pci_link_add");
736 717
737 if (!device) 718 if (!device)
738 return_VALUE(-EINVAL); 719 return -EINVAL;
739 720
740 link = kmalloc(sizeof(struct acpi_pci_link), GFP_KERNEL); 721 link = kmalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
741 if (!link) 722 if (!link)
742 return_VALUE(-ENOMEM); 723 return -ENOMEM;
743 memset(link, 0, sizeof(struct acpi_pci_link)); 724 memset(link, 0, sizeof(struct acpi_pci_link));
744 725
745 link->device = device; 726 link->device = device;
746 link->handle = device->handle;
747 strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME); 727 strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME);
748 strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS); 728 strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS);
749 acpi_driver_data(device) = link; 729 acpi_driver_data(device) = link;
@@ -782,62 +762,51 @@ static int acpi_pci_link_add(struct acpi_device *device)
782 762
783 end: 763 end:
784 /* disable all links -- to be activated on use */ 764 /* disable all links -- to be activated on use */
785 acpi_ut_evaluate_object(link->handle, "_DIS", 0, NULL); 765 acpi_ut_evaluate_object(device->handle, "_DIS", 0, NULL);
786 mutex_unlock(&acpi_link_lock); 766 mutex_unlock(&acpi_link_lock);
787 767
788 if (result) 768 if (result)
789 kfree(link); 769 kfree(link);
790 770
791 return_VALUE(result); 771 return result;
792} 772}
793 773
794static int acpi_pci_link_resume(struct acpi_pci_link *link) 774static int acpi_pci_link_resume(struct acpi_pci_link *link)
795{ 775{
796 ACPI_FUNCTION_TRACE("acpi_pci_link_resume");
797 776
798 if (link->refcnt && link->irq.active && link->irq.initialized) 777 if (link->refcnt && link->irq.active && link->irq.initialized)
799 return_VALUE(acpi_pci_link_set(link, link->irq.active)); 778 return (acpi_pci_link_set(link, link->irq.active));
800 else 779 else
801 return_VALUE(0); 780 return 0;
802} 781}
803 782
804/*
805 * FIXME: this is a workaround to avoid nasty warning. It will be removed
806 * after every device calls pci_disable_device in .resume.
807 */
808int acpi_in_resume;
809static int irqrouter_resume(struct sys_device *dev) 783static int irqrouter_resume(struct sys_device *dev)
810{ 784{
811 struct list_head *node = NULL; 785 struct list_head *node = NULL;
812 struct acpi_pci_link *link = NULL; 786 struct acpi_pci_link *link = NULL;
813 787
814 ACPI_FUNCTION_TRACE("irqrouter_resume");
815 788
816 /* Make sure SCI is enabled again (Apple firmware bug?) */ 789 /* Make sure SCI is enabled again (Apple firmware bug?) */
817 acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK); 790 acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK);
818 791
819 acpi_in_resume = 1;
820 list_for_each(node, &acpi_link.entries) { 792 list_for_each(node, &acpi_link.entries) {
821 link = list_entry(node, struct acpi_pci_link, node); 793 link = list_entry(node, struct acpi_pci_link, node);
822 if (!link) { 794 if (!link) {
823 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 795 printk(KERN_ERR PREFIX "Invalid link context\n");
824 "Invalid link context\n"));
825 continue; 796 continue;
826 } 797 }
827 acpi_pci_link_resume(link); 798 acpi_pci_link_resume(link);
828 } 799 }
829 acpi_in_resume = 0; 800 return 0;
830 return_VALUE(0);
831} 801}
832 802
833static int acpi_pci_link_remove(struct acpi_device *device, int type) 803static int acpi_pci_link_remove(struct acpi_device *device, int type)
834{ 804{
835 struct acpi_pci_link *link = NULL; 805 struct acpi_pci_link *link = NULL;
836 806
837 ACPI_FUNCTION_TRACE("acpi_pci_link_remove");
838 807
839 if (!device || !acpi_driver_data(device)) 808 if (!device || !acpi_driver_data(device))
840 return_VALUE(-EINVAL); 809 return -EINVAL;
841 810
842 link = (struct acpi_pci_link *)acpi_driver_data(device); 811 link = (struct acpi_pci_link *)acpi_driver_data(device);
843 812
@@ -847,7 +816,7 @@ static int acpi_pci_link_remove(struct acpi_device *device, int type)
847 816
848 kfree(link); 817 kfree(link);
849 818
850 return_VALUE(0); 819 return 0;
851} 820}
852 821
853/* 822/*
@@ -953,34 +922,32 @@ static int __init irqrouter_init_sysfs(void)
953{ 922{
954 int error; 923 int error;
955 924
956 ACPI_FUNCTION_TRACE("irqrouter_init_sysfs");
957 925
958 if (acpi_disabled || acpi_noirq) 926 if (acpi_disabled || acpi_noirq)
959 return_VALUE(0); 927 return 0;
960 928
961 error = sysdev_class_register(&irqrouter_sysdev_class); 929 error = sysdev_class_register(&irqrouter_sysdev_class);
962 if (!error) 930 if (!error)
963 error = sysdev_register(&device_irqrouter); 931 error = sysdev_register(&device_irqrouter);
964 932
965 return_VALUE(error); 933 return error;
966} 934}
967 935
968device_initcall(irqrouter_init_sysfs); 936device_initcall(irqrouter_init_sysfs);
969 937
970static int __init acpi_pci_link_init(void) 938static int __init acpi_pci_link_init(void)
971{ 939{
972 ACPI_FUNCTION_TRACE("acpi_pci_link_init");
973 940
974 if (acpi_noirq) 941 if (acpi_noirq)
975 return_VALUE(0); 942 return 0;
976 943
977 acpi_link.count = 0; 944 acpi_link.count = 0;
978 INIT_LIST_HEAD(&acpi_link.entries); 945 INIT_LIST_HEAD(&acpi_link.entries);
979 946
980 if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0) 947 if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0)
981 return_VALUE(-ENODEV); 948 return -ENODEV;
982 949
983 return_VALUE(0); 950 return 0;
984} 951}
985 952
986subsys_initcall(acpi_pci_link_init); 953subsys_initcall(acpi_pci_link_init);