diff options
Diffstat (limited to 'drivers/acpi/pci_link.c')
-rw-r--r-- | drivers/acpi/pci_link.c | 211 |
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 { | |||
83 | struct acpi_pci_link { | 83 | struct 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 | ||
175 | static int acpi_pci_link_get_possible(struct acpi_pci_link *link) | 169 | static 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 | ||
198 | static acpi_status | 191 | static 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 | ||
307 | static int acpi_pci_link_set(struct acpi_pci_link *link, int irq) | 296 | static 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 | ||
536 | static int acpi_irq_balance; /* 0: static, 1: balance */ | 522 | static 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 | ||
794 | static int acpi_pci_link_resume(struct acpi_pci_link *link) | 774 | static 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 | */ | ||
808 | int acpi_in_resume; | ||
809 | static int irqrouter_resume(struct sys_device *dev) | 783 | static 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 | ||
833 | static int acpi_pci_link_remove(struct acpi_device *device, int type) | 803 | static 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 | ||
968 | device_initcall(irqrouter_init_sysfs); | 936 | device_initcall(irqrouter_init_sysfs); |
969 | 937 | ||
970 | static int __init acpi_pci_link_init(void) | 938 | static 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 | ||
986 | subsys_initcall(acpi_pci_link_init); | 953 | subsys_initcall(acpi_pci_link_init); |