Lines Matching refs:php_slot

27 	struct pnv_php_slot	*php_slot;
38 static void pnv_php_disable_irq(struct pnv_php_slot *php_slot,
41 struct pci_dev *pdev = php_slot->pdev;
42 int irq = php_slot->irq;
45 if (php_slot->irq > 0) {
52 free_irq(php_slot->irq, php_slot);
53 php_slot->irq = 0;
56 if (php_slot->wq) {
57 destroy_workqueue(php_slot->wq);
58 php_slot->wq = NULL;
73 struct pnv_php_slot *php_slot = container_of(kref,
76 WARN_ON(!list_empty(&php_slot->children));
77 pnv_php_disable_irq(php_slot, false);
78 kfree(php_slot->name);
79 kfree(php_slot);
82 static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot)
85 if (!php_slot)
88 kref_put(&php_slot->kref, pnv_php_free_slot);
92 struct pnv_php_slot *php_slot)
96 if (php_slot->dn == dn) {
97 kref_get(&php_slot->kref);
98 return php_slot;
101 list_for_each_entry(tmp, &php_slot->children, link) {
112 struct pnv_php_slot *php_slot, *tmp;
117 php_slot = pnv_php_match(dn, tmp);
118 if (php_slot) {
120 return php_slot;
167 static void pnv_php_rmv_devtree(struct pnv_php_slot *php_slot)
169 pnv_php_rmv_pdns(php_slot->dn);
175 if (php_slot->fdt)
176 of_changeset_destroy(&php_slot->ocs);
177 pnv_php_detach_device_nodes(php_slot->dn);
179 if (php_slot->fdt) {
180 kfree(php_slot->dt);
181 kfree(php_slot->fdt);
182 php_slot->dt = NULL;
183 php_slot->dn->child = NULL;
184 php_slot->fdt = NULL;
255 static int pnv_php_add_devtree(struct pnv_php_slot *php_slot)
270 ret = pnv_pci_get_device_tree(php_slot->dn->phandle, fdt1, 0x10000);
272 SLOT_WARN(php_slot, "Error %d getting FDT blob\n", ret);
283 dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL);
286 SLOT_WARN(php_slot, "Cannot unflatten FDT\n");
291 of_changeset_init(&php_slot->ocs);
292 pnv_php_reverse_nodes(php_slot->dn);
293 ret = pnv_php_populate_changeset(&php_slot->ocs, php_slot->dn);
295 pnv_php_reverse_nodes(php_slot->dn);
296 SLOT_WARN(php_slot, "Error %d populating changeset\n",
301 php_slot->dn->child = NULL;
302 ret = of_changeset_apply(&php_slot->ocs);
304 SLOT_WARN(php_slot, "Error %d applying changeset\n", ret);
309 pnv_php_add_pdns(php_slot);
310 php_slot->fdt = fdt;
311 php_slot->dt = dt;
316 of_changeset_destroy(&php_slot->ocs);
319 php_slot->dn->child = NULL;
336 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
340 ret = pnv_pci_set_power_state(php_slot->id, state, &msg);
342 if (be64_to_cpu(msg.params[1]) != php_slot->dn->phandle ||
344 SLOT_WARN(php_slot, "Wrong msg (%lld, %lld, %lld)\n",
359 pnv_php_rmv_devtree(php_slot);
361 ret = pnv_php_add_devtree(php_slot);
366 SLOT_WARN(php_slot, "Error %d powering %s\n",
374 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
383 ret = pnv_pci_get_power_state(php_slot->id, &power_state);
385 SLOT_WARN(php_slot, "Error %d getting power status\n",
396 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
404 ret = pnv_pci_get_presence_state(php_slot->id, &presence);
409 SLOT_WARN(php_slot, "Error %d getting presence\n", ret);
417 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
419 *state = php_slot->attention_state;
425 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
426 struct pci_dev *bridge = php_slot->pdev;
429 php_slot->attention_state = state;
445 static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan)
447 struct hotplug_slot *slot = &php_slot->slot;
453 if (php_slot->state != PNV_PHP_STATE_REGISTERED)
468 if (!php_slot->power_state_check) {
469 php_slot->power_state_check = true;
487 if (!php_slot->power_state_check) {
488 php_slot->power_state_check = true;
515 pci_hp_add_devices(php_slot->bus);
520 php_slot->state = PNV_PHP_STATE_POPULATED;
522 pnv_php_register(php_slot->dn);
524 php_slot->state = PNV_PHP_STATE_POPULATED;
532 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
533 struct pci_dev *bridge = php_slot->pdev;
545 if (php_slot->irq > 0)
546 disable_irq(php_slot->irq);
551 pcie_capability_read_word(php_slot->pdev, PCI_EXP_SLTSTA, &sts);
553 pcie_capability_write_word(php_slot->pdev, PCI_EXP_SLTSTA, sts);
555 if (php_slot->irq > 0)
556 enable_irq(php_slot->irq);
563 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
565 return pnv_php_enable(php_slot, true);
570 struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
578 if (php_slot->state != PNV_PHP_STATE_POPULATED &&
579 php_slot->state != PNV_PHP_STATE_REGISTERED)
584 pci_hp_remove_devices(php_slot->bus);
588 pnv_php_unregister(php_slot->dn);
593 php_slot->state = PNV_PHP_STATE_REGISTERED;
607 static void pnv_php_release(struct pnv_php_slot *php_slot)
613 list_del(&php_slot->link);
617 pnv_php_put_slot(php_slot);
618 pnv_php_put_slot(php_slot->parent);
623 struct pnv_php_slot *php_slot;
640 php_slot = kzalloc(sizeof(*php_slot), GFP_KERNEL);
641 if (!php_slot)
644 php_slot->name = kstrdup(label, GFP_KERNEL);
645 if (!php_slot->name) {
646 kfree(php_slot);
651 php_slot->slot_no = PCI_SLOT(PCI_DN(dn->child)->devfn);
653 php_slot->slot_no = -1; /* Placeholder slot */
655 kref_init(&php_slot->kref);
656 php_slot->state = PNV_PHP_STATE_INITIALIZED;
657 php_slot->dn = dn;
658 php_slot->pdev = bus->self;
659 php_slot->bus = bus;
660 php_slot->id = id;
661 php_slot->power_state_check = false;
662 php_slot->slot.ops = &php_slot_ops;
664 INIT_LIST_HEAD(&php_slot->children);
665 INIT_LIST_HEAD(&php_slot->link);
667 return php_slot;
670 static int pnv_php_register_slot(struct pnv_php_slot *php_slot)
673 struct device_node *dn = php_slot->dn;
678 parent = pnv_php_find_slot(php_slot->dn);
685 ret = pci_hp_register(&php_slot->slot, php_slot->bus,
686 php_slot->slot_no, php_slot->name);
688 SLOT_WARN(php_slot, "Error %d registering slot\n", ret);
709 php_slot->parent = parent;
711 list_add_tail(&php_slot->link, &parent->children);
713 list_add_tail(&php_slot->link, &pnv_php_slot_list);
716 php_slot->state = PNV_PHP_STATE_REGISTERED;
720 static int pnv_php_enable_msix(struct pnv_php_slot *php_slot)
722 struct pci_dev *pdev = php_slot->pdev;
741 SLOT_WARN(php_slot, "Error %d enabling MSIx\n", ret);
752 struct pnv_php_slot *php_slot = event->php_slot;
755 pnv_php_enable_slot(&php_slot->slot);
757 pnv_php_disable_slot(&php_slot->slot);
764 struct pnv_php_slot *php_slot = data;
765 struct pci_dev *pchild, *pdev = php_slot->pdev;
780 php_slot->name,
787 } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) &&
789 ret = pnv_pci_get_presence_state(php_slot->id, &presence);
791 SLOT_WARN(php_slot,
793 php_slot->name, ret, sts);
799 pci_dbg(pdev, "PCI slot [%s]: Spurious IRQ?\n", php_slot->name);
805 pchild = list_first_entry_or_null(&php_slot->bus->devices,
823 SLOT_WARN(php_slot,
825 php_slot->name, sts);
830 php_slot->name, added ? "added" : "removed", irq);
833 event->php_slot = php_slot;
834 queue_work(php_slot->wq, &event->work);
839 static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq)
841 struct pci_dev *pdev = php_slot->pdev;
847 php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name);
848 if (!php_slot->wq) {
849 SLOT_WARN(php_slot, "Cannot alloc workqueue\n");
850 pnv_php_disable_irq(php_slot, true);
855 ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc",
858 php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC;
862 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC)
870 php_slot->name, php_slot);
872 pnv_php_disable_irq(php_slot, true);
873 SLOT_WARN(php_slot, "Error %d enabling IRQ %d\n", ret, irq);
879 if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) {
891 php_slot->irq = irq;
894 static void pnv_php_enable_irq(struct pnv_php_slot *php_slot)
896 struct pci_dev *pdev = php_slot->pdev;
909 SLOT_WARN(php_slot, "Error %d enabling device\n", ret);
916 irq = pnv_php_enable_msix(php_slot);
918 pnv_php_init_irq(php_slot, irq);
929 pnv_php_init_irq(php_slot, irq);
935 struct pnv_php_slot *php_slot;
948 php_slot = pnv_php_alloc_slot(dn);
949 if (!php_slot)
952 ret = pnv_php_register_slot(php_slot);
956 ret = pnv_php_enable(php_slot, false);
963 pnv_php_enable_irq(php_slot);
968 pnv_php_unregister_one(php_slot->dn);
970 pnv_php_put_slot(php_slot);
990 struct pnv_php_slot *php_slot;
992 php_slot = pnv_php_find_slot(dn);
993 if (!php_slot)
996 php_slot->state = PNV_PHP_STATE_OFFLINE;
997 pci_hp_deregister(&php_slot->slot);
998 pnv_php_release(php_slot);
999 pnv_php_put_slot(php_slot);