1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#define pr_fmt(fmt) "acpiphp_glue: " fmt
29
30#include <linux/module.h>
31
32#include <linux/kernel.h>
33#include <linux/pci.h>
34#include <linux/pci_hotplug.h>
35#include <linux/pci-acpi.h>
36#include <linux/pm_runtime.h>
37#include <linux/mutex.h>
38#include <linux/slab.h>
39#include <linux/acpi.h>
40
41#include "../pci.h"
42#include "acpiphp.h"
43
44static LIST_HEAD(bridge_list);
45static DEFINE_MUTEX(bridge_mutex);
46
47static int acpiphp_hotplug_notify(struct acpi_device *adev, u32 type);
48static void acpiphp_post_dock_fixup(struct acpi_device *adev);
49static void acpiphp_sanitize_bus(struct pci_bus *bus);
50static void hotplug_event(u32 type, struct acpiphp_context *context);
51static void free_bridge(struct kref *kref);
52
53
54
55
56
57
58
59static struct acpiphp_context *acpiphp_init_context(struct acpi_device *adev)
60{
61 struct acpiphp_context *context;
62
63 context = kzalloc(sizeof(*context), GFP_KERNEL);
64 if (!context)
65 return NULL;
66
67 context->refcount = 1;
68 context->hp.notify = acpiphp_hotplug_notify;
69 context->hp.fixup = acpiphp_post_dock_fixup;
70 acpi_set_hp_context(adev, &context->hp);
71 return context;
72}
73
74
75
76
77
78
79
80static struct acpiphp_context *acpiphp_get_context(struct acpi_device *adev)
81{
82 struct acpiphp_context *context;
83
84 if (!adev->hp)
85 return NULL;
86
87 context = to_acpiphp_context(adev->hp);
88 context->refcount++;
89 return context;
90}
91
92
93
94
95
96
97
98
99
100static void acpiphp_put_context(struct acpiphp_context *context)
101{
102 if (--context->refcount)
103 return;
104
105 WARN_ON(context->bridge);
106 context->hp.self->hp = NULL;
107 kfree(context);
108}
109
110static inline void get_bridge(struct acpiphp_bridge *bridge)
111{
112 kref_get(&bridge->ref);
113}
114
115static inline void put_bridge(struct acpiphp_bridge *bridge)
116{
117 kref_put(&bridge->ref, free_bridge);
118}
119
120static struct acpiphp_context *acpiphp_grab_context(struct acpi_device *adev)
121{
122 struct acpiphp_context *context;
123
124 acpi_lock_hp_context();
125 context = acpiphp_get_context(adev);
126 if (!context || context->func.parent->is_going_away) {
127 acpi_unlock_hp_context();
128 return NULL;
129 }
130 get_bridge(context->func.parent);
131 acpiphp_put_context(context);
132 acpi_unlock_hp_context();
133 return context;
134}
135
136static void acpiphp_let_context_go(struct acpiphp_context *context)
137{
138 put_bridge(context->func.parent);
139}
140
141static void free_bridge(struct kref *kref)
142{
143 struct acpiphp_context *context;
144 struct acpiphp_bridge *bridge;
145 struct acpiphp_slot *slot, *next;
146 struct acpiphp_func *func, *tmp;
147
148 acpi_lock_hp_context();
149
150 bridge = container_of(kref, struct acpiphp_bridge, ref);
151
152 list_for_each_entry_safe(slot, next, &bridge->slots, node) {
153 list_for_each_entry_safe(func, tmp, &slot->funcs, sibling)
154 acpiphp_put_context(func_to_context(func));
155
156 kfree(slot);
157 }
158
159 context = bridge->context;
160
161 if (context) {
162
163 put_bridge(context->func.parent);
164 context->bridge = NULL;
165 acpiphp_put_context(context);
166 }
167
168 put_device(&bridge->pci_bus->dev);
169 pci_dev_put(bridge->pci_dev);
170 kfree(bridge);
171
172 acpi_unlock_hp_context();
173}
174
175
176
177
178
179
180
181static void acpiphp_post_dock_fixup(struct acpi_device *adev)
182{
183 struct acpiphp_context *context = acpiphp_grab_context(adev);
184 struct pci_bus *bus;
185 u32 buses;
186
187 if (!context)
188 return;
189
190 bus = context->func.slot->bus;
191 if (!bus->self)
192 goto out;
193
194
195
196
197 pci_read_config_dword(bus->self, PCI_PRIMARY_BUS, &buses);
198
199 if (((buses >> 8) & 0xff) != bus->busn_res.start) {
200 buses = (buses & 0xff000000)
201 | ((unsigned int)(bus->primary) << 0)
202 | ((unsigned int)(bus->busn_res.start) << 8)
203 | ((unsigned int)(bus->busn_res.end) << 16);
204 pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses);
205 }
206
207 out:
208 acpiphp_let_context_go(context);
209}
210
211
212
213
214
215
216
217
218static acpi_status acpiphp_add_context(acpi_handle handle, u32 lvl, void *data,
219 void **rv)
220{
221 struct acpiphp_bridge *bridge = data;
222 struct acpiphp_context *context;
223 struct acpi_device *adev;
224 struct acpiphp_slot *slot;
225 struct acpiphp_func *newfunc;
226 acpi_status status = AE_OK;
227 unsigned long long adr;
228 int device, function;
229 struct pci_bus *pbus = bridge->pci_bus;
230 struct pci_dev *pdev = bridge->pci_dev;
231 u32 val;
232
233 status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
234 if (ACPI_FAILURE(status)) {
235 if (status != AE_NOT_FOUND)
236 acpi_handle_warn(handle,
237 "can't evaluate _ADR (%#x)\n", status);
238 return AE_OK;
239 }
240 if (acpi_bus_get_device(handle, &adev))
241 return AE_OK;
242
243 device = (adr >> 16) & 0xffff;
244 function = adr & 0xffff;
245
246 acpi_lock_hp_context();
247 context = acpiphp_init_context(adev);
248 if (!context) {
249 acpi_unlock_hp_context();
250 acpi_handle_err(handle, "No hotplug context\n");
251 return AE_NOT_EXIST;
252 }
253 newfunc = &context->func;
254 newfunc->function = function;
255 newfunc->parent = bridge;
256 acpi_unlock_hp_context();
257
258
259
260
261
262 if (!is_dock_device(adev) && acpi_has_method(handle, "_EJ0"))
263 newfunc->flags = FUNC_HAS_EJ0;
264
265 if (acpi_has_method(handle, "_STA"))
266 newfunc->flags |= FUNC_HAS_STA;
267
268
269 list_for_each_entry(slot, &bridge->slots, node)
270 if (slot->device == device)
271 goto slot_found;
272
273 slot = kzalloc(sizeof(struct acpiphp_slot), GFP_KERNEL);
274 if (!slot) {
275 acpi_lock_hp_context();
276 acpiphp_put_context(context);
277 acpi_unlock_hp_context();
278 return AE_NO_MEMORY;
279 }
280
281 slot->bus = bridge->pci_bus;
282 slot->device = device;
283 INIT_LIST_HEAD(&slot->funcs);
284
285 list_add_tail(&slot->node, &bridge->slots);
286
287
288
289
290
291
292
293
294 if ((acpi_pci_check_ejectable(pbus, handle) || is_dock_device(adev))
295 && !(pdev && hotplug_is_native(pdev))) {
296 unsigned long long sun;
297 int retval;
298
299 bridge->nr_slots++;
300 status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun);
301 if (ACPI_FAILURE(status))
302 sun = bridge->nr_slots;
303
304 pr_debug("found ACPI PCI Hotplug slot %llu at PCI %04x:%02x:%02x\n",
305 sun, pci_domain_nr(pbus), pbus->number, device);
306
307 retval = acpiphp_register_hotplug_slot(slot, sun);
308 if (retval) {
309 slot->slot = NULL;
310 bridge->nr_slots--;
311 if (retval == -EBUSY)
312 pr_warn("Slot %llu already registered by another hotplug driver\n", sun);
313 else
314 pr_warn("acpiphp_register_hotplug_slot failed (err code = 0x%x)\n", retval);
315 }
316
317 }
318
319 slot_found:
320 newfunc->slot = slot;
321 list_add_tail(&newfunc->sibling, &slot->funcs);
322
323 if (pci_bus_read_dev_vendor_id(pbus, PCI_DEVFN(device, function),
324 &val, 60*1000))
325 slot->flags |= SLOT_ENABLED;
326
327 return AE_OK;
328}
329
330static void cleanup_bridge(struct acpiphp_bridge *bridge)
331{
332 struct acpiphp_slot *slot;
333 struct acpiphp_func *func;
334
335 list_for_each_entry(slot, &bridge->slots, node) {
336 list_for_each_entry(func, &slot->funcs, sibling) {
337 struct acpi_device *adev = func_to_acpi_device(func);
338
339 acpi_lock_hp_context();
340 adev->hp->notify = NULL;
341 adev->hp->fixup = NULL;
342 acpi_unlock_hp_context();
343 }
344 slot->flags |= SLOT_IS_GOING_AWAY;
345 if (slot->slot)
346 acpiphp_unregister_hotplug_slot(slot);
347 }
348
349 mutex_lock(&bridge_mutex);
350 list_del(&bridge->list);
351 mutex_unlock(&bridge_mutex);
352
353 acpi_lock_hp_context();
354 bridge->is_going_away = true;
355 acpi_unlock_hp_context();
356}
357
358
359
360
361
362static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
363{
364 struct pci_bus *tmp;
365 unsigned char max, n;
366
367
368
369
370
371
372
373
374
375 max = bus->busn_res.start;
376
377 list_for_each_entry(tmp, &bus->children, node) {
378 n = pci_bus_max_busnr(tmp);
379 if (n > max)
380 max = n;
381 }
382 return max;
383}
384
385static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
386{
387 struct acpiphp_func *func;
388 union acpi_object params[2];
389 struct acpi_object_list arg_list;
390
391 list_for_each_entry(func, &slot->funcs, sibling) {
392 arg_list.count = 2;
393 arg_list.pointer = params;
394 params[0].type = ACPI_TYPE_INTEGER;
395 params[0].integer.value = ACPI_ADR_SPACE_PCI_CONFIG;
396 params[1].type = ACPI_TYPE_INTEGER;
397 params[1].integer.value = 1;
398
399 acpi_evaluate_object(func_to_handle(func), "_REG", &arg_list,
400 NULL);
401 }
402}
403
404static void check_hotplug_bridge(struct acpiphp_slot *slot, struct pci_dev *dev)
405{
406 struct acpiphp_func *func;
407
408
409 if (dev->is_hotplug_bridge)
410 return;
411
412 list_for_each_entry(func, &slot->funcs, sibling) {
413 if (PCI_FUNC(dev->devfn) == func->function) {
414 dev->is_hotplug_bridge = 1;
415 break;
416 }
417 }
418}
419
420static int acpiphp_rescan_slot(struct acpiphp_slot *slot)
421{
422 struct acpiphp_func *func;
423
424 list_for_each_entry(func, &slot->funcs, sibling) {
425 struct acpi_device *adev = func_to_acpi_device(func);
426
427 acpi_bus_scan(adev->handle);
428 if (acpi_device_enumerated(adev))
429 acpi_device_set_power(adev, ACPI_STATE_D0);
430 }
431 return pci_scan_slot(slot->bus, PCI_DEVFN(slot->device, 0));
432}
433
434static void acpiphp_native_scan_bridge(struct pci_dev *bridge)
435{
436 struct pci_bus *bus = bridge->subordinate;
437 struct pci_dev *dev;
438 int max;
439
440 if (!bus)
441 return;
442
443 max = bus->busn_res.start;
444
445 for_each_pci_bridge(dev, bus) {
446 if (!hotplug_is_native(dev))
447 max = pci_scan_bridge(bus, dev, max, 0);
448 }
449
450
451 for_each_pci_bridge(dev, bus) {
452 if (!hotplug_is_native(dev))
453 max = pci_scan_bridge(bus, dev, max, 1);
454 }
455}
456
457
458
459
460
461
462
463
464
465static void enable_slot(struct acpiphp_slot *slot, bool bridge)
466{
467 struct pci_dev *dev;
468 struct pci_bus *bus = slot->bus;
469 struct acpiphp_func *func;
470
471 if (bridge && bus->self && hotplug_is_native(bus->self)) {
472
473
474
475
476
477
478
479 for_each_pci_bridge(dev, bus) {
480 if (PCI_SLOT(dev->devfn) == slot->device)
481 acpiphp_native_scan_bridge(dev);
482 }
483 pci_assign_unassigned_bridge_resources(bus->self);
484 } else {
485 LIST_HEAD(add_list);
486 int max, pass;
487
488 acpiphp_rescan_slot(slot);
489 max = acpiphp_max_busnr(bus);
490 for (pass = 0; pass < 2; pass++) {
491 for_each_pci_bridge(dev, bus) {
492 if (PCI_SLOT(dev->devfn) != slot->device)
493 continue;
494
495 max = pci_scan_bridge(bus, dev, max, pass);
496 if (pass && dev->subordinate) {
497 check_hotplug_bridge(slot, dev);
498 pcibios_resource_survey_bus(dev->subordinate);
499 __pci_bus_size_bridges(dev->subordinate,
500 &add_list);
501 }
502 }
503 }
504 __pci_bus_assign_resources(bus, &add_list, NULL);
505 }
506
507 acpiphp_sanitize_bus(bus);
508 pcie_bus_configure_settings(bus);
509 acpiphp_set_acpi_region(slot);
510
511 list_for_each_entry(dev, &bus->devices, bus_list) {
512
513 if (!pci_dev_is_added(dev))
514 dev->current_state = PCI_D0;
515 }
516
517 pci_bus_add_devices(bus);
518
519 slot->flags |= SLOT_ENABLED;
520 list_for_each_entry(func, &slot->funcs, sibling) {
521 dev = pci_get_slot(bus, PCI_DEVFN(slot->device,
522 func->function));
523 if (!dev) {
524
525
526 slot->flags &= ~SLOT_ENABLED;
527 continue;
528 }
529 }
530}
531
532
533
534
535
536static void disable_slot(struct acpiphp_slot *slot)
537{
538 struct pci_bus *bus = slot->bus;
539 struct pci_dev *dev, *prev;
540 struct acpiphp_func *func;
541
542
543
544
545
546
547
548 list_for_each_entry_safe_reverse(dev, prev, &bus->devices, bus_list)
549 if (PCI_SLOT(dev->devfn) == slot->device)
550 pci_stop_and_remove_bus_device(dev);
551
552 list_for_each_entry(func, &slot->funcs, sibling)
553 acpi_bus_trim(func_to_acpi_device(func));
554
555 slot->flags &= ~SLOT_ENABLED;
556}
557
558static bool slot_no_hotplug(struct acpiphp_slot *slot)
559{
560 struct pci_bus *bus = slot->bus;
561 struct pci_dev *dev;
562
563 list_for_each_entry(dev, &bus->devices, bus_list) {
564 if (PCI_SLOT(dev->devfn) == slot->device && dev->ignore_hotplug)
565 return true;
566 }
567 return false;
568}
569
570
571
572
573
574
575
576
577
578
579
580
581
582static unsigned int get_slot_status(struct acpiphp_slot *slot)
583{
584 unsigned long long sta = 0;
585 struct acpiphp_func *func;
586 u32 dvid;
587
588 list_for_each_entry(func, &slot->funcs, sibling) {
589 if (func->flags & FUNC_HAS_STA) {
590 acpi_status status;
591
592 status = acpi_evaluate_integer(func_to_handle(func),
593 "_STA", NULL, &sta);
594 if (ACPI_SUCCESS(status) && sta)
595 break;
596 } else {
597 if (pci_bus_read_dev_vendor_id(slot->bus,
598 PCI_DEVFN(slot->device, func->function),
599 &dvid, 0)) {
600 sta = ACPI_STA_ALL;
601 break;
602 }
603 }
604 }
605
606 if (!sta) {
607
608
609
610
611
612 if (pci_bus_read_dev_vendor_id(slot->bus,
613 PCI_DEVFN(slot->device, 0), &dvid, 0)) {
614 sta = ACPI_STA_ALL;
615 }
616 }
617
618 return (unsigned int)sta;
619}
620
621static inline bool device_status_valid(unsigned int sta)
622{
623
624
625
626
627
628 unsigned int mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING;
629 return (sta & mask) == mask;
630}
631
632
633
634
635
636static void trim_stale_devices(struct pci_dev *dev)
637{
638 struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
639 struct pci_bus *bus = dev->subordinate;
640 bool alive = dev->ignore_hotplug;
641
642 if (adev) {
643 acpi_status status;
644 unsigned long long sta;
645
646 status = acpi_evaluate_integer(adev->handle, "_STA", NULL, &sta);
647 alive = alive || (ACPI_SUCCESS(status) && device_status_valid(sta));
648 }
649 if (!alive)
650 alive = pci_device_is_present(dev);
651
652 if (!alive) {
653 pci_dev_set_disconnected(dev, NULL);
654 if (pci_has_subordinate(dev))
655 pci_walk_bus(dev->subordinate, pci_dev_set_disconnected,
656 NULL);
657
658 pci_stop_and_remove_bus_device(dev);
659 if (adev)
660 acpi_bus_trim(adev);
661 } else if (bus) {
662 struct pci_dev *child, *tmp;
663
664
665 pm_runtime_get_sync(&dev->dev);
666 list_for_each_entry_safe_reverse(child, tmp, &bus->devices, bus_list)
667 trim_stale_devices(child);
668
669 pm_runtime_put(&dev->dev);
670 }
671}
672
673
674
675
676
677
678
679
680static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
681{
682 struct acpiphp_slot *slot;
683
684
685 if (bridge->is_going_away)
686 return;
687
688 if (bridge->pci_dev)
689 pm_runtime_get_sync(&bridge->pci_dev->dev);
690
691 list_for_each_entry(slot, &bridge->slots, node) {
692 struct pci_bus *bus = slot->bus;
693 struct pci_dev *dev, *tmp;
694
695 if (slot_no_hotplug(slot)) {
696 ;
697 } else if (device_status_valid(get_slot_status(slot))) {
698
699 list_for_each_entry_safe_reverse(dev, tmp,
700 &bus->devices, bus_list)
701 if (PCI_SLOT(dev->devfn) == slot->device)
702 trim_stale_devices(dev);
703
704
705 enable_slot(slot, true);
706 } else {
707 disable_slot(slot);
708 }
709 }
710
711 if (bridge->pci_dev)
712 pm_runtime_put(&bridge->pci_dev->dev);
713}
714
715
716
717
718
719static void acpiphp_sanitize_bus(struct pci_bus *bus)
720{
721 struct pci_dev *dev, *tmp;
722 int i;
723 unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
724
725 list_for_each_entry_safe_reverse(dev, tmp, &bus->devices, bus_list) {
726 for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) {
727 struct resource *res = &dev->resource[i];
728 if ((res->flags & type_mask) && !res->start &&
729 res->end) {
730
731
732 pci_stop_and_remove_bus_device(dev);
733 break;
734 }
735 }
736 }
737}
738
739
740
741
742
743void acpiphp_check_host_bridge(struct acpi_device *adev)
744{
745 struct acpiphp_bridge *bridge = NULL;
746
747 acpi_lock_hp_context();
748 if (adev->hp) {
749 bridge = to_acpiphp_root_context(adev->hp)->root_bridge;
750 if (bridge)
751 get_bridge(bridge);
752 }
753 acpi_unlock_hp_context();
754 if (bridge) {
755 pci_lock_rescan_remove();
756
757 acpiphp_check_bridge(bridge);
758
759 pci_unlock_rescan_remove();
760 put_bridge(bridge);
761 }
762}
763
764static int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot);
765
766static void hotplug_event(u32 type, struct acpiphp_context *context)
767{
768 acpi_handle handle = context->hp.self->handle;
769 struct acpiphp_func *func = &context->func;
770 struct acpiphp_slot *slot = func->slot;
771 struct acpiphp_bridge *bridge;
772
773 acpi_lock_hp_context();
774 bridge = context->bridge;
775 if (bridge)
776 get_bridge(bridge);
777
778 acpi_unlock_hp_context();
779
780 pci_lock_rescan_remove();
781
782 switch (type) {
783 case ACPI_NOTIFY_BUS_CHECK:
784
785 acpi_handle_debug(handle, "Bus check in %s()\n", __func__);
786 if (bridge)
787 acpiphp_check_bridge(bridge);
788 else if (!(slot->flags & SLOT_IS_GOING_AWAY))
789 enable_slot(slot, false);
790
791 break;
792
793 case ACPI_NOTIFY_DEVICE_CHECK:
794
795 acpi_handle_debug(handle, "Device check in %s()\n", __func__);
796 if (bridge) {
797 acpiphp_check_bridge(bridge);
798 } else if (!(slot->flags & SLOT_IS_GOING_AWAY)) {
799
800
801
802
803 if (acpiphp_rescan_slot(slot))
804 acpiphp_check_bridge(func->parent);
805 }
806 break;
807
808 case ACPI_NOTIFY_EJECT_REQUEST:
809
810 acpi_handle_debug(handle, "Eject request in %s()\n", __func__);
811 acpiphp_disable_and_eject_slot(slot);
812 break;
813 }
814
815 pci_unlock_rescan_remove();
816 if (bridge)
817 put_bridge(bridge);
818}
819
820static int acpiphp_hotplug_notify(struct acpi_device *adev, u32 type)
821{
822 struct acpiphp_context *context;
823
824 context = acpiphp_grab_context(adev);
825 if (!context)
826 return -ENODATA;
827
828 hotplug_event(type, context);
829 acpiphp_let_context_go(context);
830 return 0;
831}
832
833
834
835
836
837
838
839
840void acpiphp_enumerate_slots(struct pci_bus *bus)
841{
842 struct acpiphp_bridge *bridge;
843 struct acpi_device *adev;
844 acpi_handle handle;
845 acpi_status status;
846
847 if (acpiphp_disabled)
848 return;
849
850 adev = ACPI_COMPANION(bus->bridge);
851 if (!adev)
852 return;
853
854 handle = adev->handle;
855 bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
856 if (!bridge)
857 return;
858
859 INIT_LIST_HEAD(&bridge->slots);
860 kref_init(&bridge->ref);
861 bridge->pci_dev = pci_dev_get(bus->self);
862 bridge->pci_bus = bus;
863
864
865
866
867
868
869 get_device(&bus->dev);
870
871 acpi_lock_hp_context();
872 if (pci_is_root_bus(bridge->pci_bus)) {
873 struct acpiphp_root_context *root_context;
874
875 root_context = kzalloc(sizeof(*root_context), GFP_KERNEL);
876 if (!root_context)
877 goto err;
878
879 root_context->root_bridge = bridge;
880 acpi_set_hp_context(adev, &root_context->hp);
881 } else {
882 struct acpiphp_context *context;
883
884
885
886
887
888
889
890 context = acpiphp_get_context(adev);
891 if (!context)
892 goto err;
893
894 bridge->context = context;
895 context->bridge = bridge;
896
897 get_bridge(context->func.parent);
898 }
899 acpi_unlock_hp_context();
900
901
902 mutex_lock(&bridge_mutex);
903 list_add(&bridge->list, &bridge_list);
904 mutex_unlock(&bridge_mutex);
905
906
907 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
908 acpiphp_add_context, NULL, bridge, NULL);
909 if (ACPI_FAILURE(status)) {
910 acpi_handle_err(handle, "failed to register slots\n");
911 cleanup_bridge(bridge);
912 put_bridge(bridge);
913 }
914 return;
915
916 err:
917 acpi_unlock_hp_context();
918 put_device(&bus->dev);
919 pci_dev_put(bridge->pci_dev);
920 kfree(bridge);
921}
922
923static void acpiphp_drop_bridge(struct acpiphp_bridge *bridge)
924{
925 if (pci_is_root_bus(bridge->pci_bus)) {
926 struct acpiphp_root_context *root_context;
927 struct acpi_device *adev;
928
929 acpi_lock_hp_context();
930 adev = ACPI_COMPANION(bridge->pci_bus->bridge);
931 root_context = to_acpiphp_root_context(adev->hp);
932 adev->hp = NULL;
933 acpi_unlock_hp_context();
934 kfree(root_context);
935 }
936 cleanup_bridge(bridge);
937 put_bridge(bridge);
938}
939
940
941
942
943
944void acpiphp_remove_slots(struct pci_bus *bus)
945{
946 struct acpiphp_bridge *bridge;
947
948 if (acpiphp_disabled)
949 return;
950
951 mutex_lock(&bridge_mutex);
952 list_for_each_entry(bridge, &bridge_list, list)
953 if (bridge->pci_bus == bus) {
954 mutex_unlock(&bridge_mutex);
955 acpiphp_drop_bridge(bridge);
956 return;
957 }
958
959 mutex_unlock(&bridge_mutex);
960}
961
962
963
964
965
966int acpiphp_enable_slot(struct acpiphp_slot *slot)
967{
968 pci_lock_rescan_remove();
969
970 if (slot->flags & SLOT_IS_GOING_AWAY) {
971 pci_unlock_rescan_remove();
972 return -ENODEV;
973 }
974
975
976 if (!(slot->flags & SLOT_ENABLED))
977 enable_slot(slot, false);
978
979 pci_unlock_rescan_remove();
980 return 0;
981}
982
983
984
985
986
987static int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot)
988{
989 struct acpiphp_func *func;
990
991 if (slot->flags & SLOT_IS_GOING_AWAY)
992 return -ENODEV;
993
994
995 disable_slot(slot);
996
997 list_for_each_entry(func, &slot->funcs, sibling)
998 if (func->flags & FUNC_HAS_EJ0) {
999 acpi_handle handle = func_to_handle(func);
1000
1001 if (ACPI_FAILURE(acpi_evaluate_ej0(handle)))
1002 acpi_handle_err(handle, "_EJ0 failed\n");
1003
1004 break;
1005 }
1006
1007 return 0;
1008}
1009
1010int acpiphp_disable_slot(struct acpiphp_slot *slot)
1011{
1012 int ret;
1013
1014
1015
1016
1017
1018 acpi_scan_lock_acquire();
1019 pci_lock_rescan_remove();
1020 ret = acpiphp_disable_and_eject_slot(slot);
1021 pci_unlock_rescan_remove();
1022 acpi_scan_lock_release();
1023 return ret;
1024}
1025
1026
1027
1028
1029
1030u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
1031{
1032 return (slot->flags & SLOT_ENABLED);
1033}
1034
1035
1036
1037
1038
1039u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
1040{
1041 return !(get_slot_status(slot) & ACPI_STA_DEVICE_UI);
1042}
1043
1044
1045
1046
1047
1048u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
1049{
1050 return !!get_slot_status(slot);
1051}
1052