Lines Matching refs:pdev

58 	struct pcifront_device *pdev;
64 return sd->pdev;
69 struct pcifront_device *pdev)
74 sd->pdev = pdev;
102 static inline void schedule_pcifront_aer_op(struct pcifront_device *pdev)
104 if (test_bit(_XEN_PCIB_active, (unsigned long *)&pdev->sh_info->flags)
105 && !test_and_set_bit(_PDEVB_op_active, &pdev->flags)) {
106 dev_dbg(&pdev->xdev->dev, "schedule aer frontend job\n");
107 schedule_work(&pdev->op_work);
111 static int do_pci_op(struct pcifront_device *pdev, struct xen_pci_op *op)
114 struct xen_pci_op *active_op = &pdev->sh_info->op;
116 evtchn_port_t port = pdev->evtchn;
117 unsigned int irq = pdev->irq;
120 spin_lock_irqsave(&pdev->sh_info_lock, irq_flags);
126 set_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags);
140 (unsigned long *)&pdev->sh_info->flags)) {
145 dev_err(&pdev->xdev->dev,
148 (unsigned long *)&pdev->sh_info->flags);
160 (unsigned long *)&pdev->sh_info->flags)) {
161 dev_err(&pdev->xdev->dev,
163 schedule_pcifront_aer_op(pdev);
170 spin_unlock_irqrestore(&pdev->sh_info_lock, irq_flags);
188 struct pcifront_device *pdev = pcifront_get_pdev(sd);
190 dev_dbg(&pdev->xdev->dev,
195 err = do_pci_op(pdev, &op);
198 dev_dbg(&pdev->xdev->dev, "read got back value %x\n",
225 struct pcifront_device *pdev = pcifront_get_pdev(sd);
227 dev_dbg(&pdev->xdev->dev,
232 return errno_to_pcibios_err(do_pci_op(pdev, &op));
254 struct pcifront_device *pdev = pcifront_get_pdev(sd);
271 err = do_pci_op(pdev, &op);
306 struct pcifront_device *pdev = pcifront_get_pdev(sd);
308 err = do_pci_op(pdev, &op);
325 struct pcifront_device *pdev = pcifront_get_pdev(sd);
327 err = do_pci_op(pdev, &op);
354 struct pcifront_device *pdev = pcifront_get_pdev(sd);
356 err = do_pci_op(pdev, &op);
388 struct pcifront_device *pdev = data;
394 dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n",
397 dev_err(&pdev->xdev->dev, "Could not claim resource %s/%d! "
407 static int pcifront_scan_bus(struct pcifront_device *pdev,
429 dev_info(&pdev->xdev->dev, "New device on "
437 static int pcifront_scan_root(struct pcifront_device *pdev,
453 dev_err(&pdev->xdev->dev,
455 dev_err(&pdev->xdev->dev,
462 dev_info(&pdev->xdev->dev, "Creating PCI Frontend Bus %04x:%02x\n",
474 pcifront_init_sd(sd, domain, bus, pdev);
478 b = pci_scan_root_bus(&pdev->xdev->dev, bus,
481 dev_err(&pdev->xdev->dev,
491 list_add(&bus_entry->list, &pdev->root_buses);
497 err = pcifront_scan_bus(pdev, domain, bus, b);
500 pci_walk_bus(b, pcifront_claim_resource, pdev);
515 static int pcifront_rescan_root(struct pcifront_device *pdev,
524 return pcifront_scan_root(pdev, domain, bus);
526 dev_info(&pdev->xdev->dev, "Rescanning PCI Frontend Bus %04x:%02x\n",
529 err = pcifront_scan_bus(pdev, domain, bus, b);
532 pci_walk_bus(b, pcifront_claim_resource, pdev);
552 static void pcifront_free_roots(struct pcifront_device *pdev)
556 dev_dbg(&pdev->xdev->dev, "cleaning up root buses\n");
559 list_for_each_entry_safe(bus_entry, t, &pdev->root_buses, list) {
575 struct pcifront_device *pdev,
579 int bus = pdev->sh_info->aer_op.bus;
580 int devfn = pdev->sh_info->aer_op.devfn;
581 int domain = pdev->sh_info->aer_op.domain;
584 dev_dbg(&pdev->xdev->dev,
590 dev_err(&pdev->xdev->dev, "device or AER driver is NULL\n");
609 dev_err(&pdev->xdev->dev,
620 struct pcifront_device *pdev =
622 int cmd = pdev->sh_info->aer_op.cmd;
624 (pci_channel_state_t)pdev->sh_info->aer_op.err;
630 dev_dbg(&pdev->xdev->dev,
632 pdev->sh_info->aer_op.bus, pdev->sh_info->aer_op.devfn);
634 pdev->sh_info->aer_op.err = pcifront_common_process(cmd, pdev, state);
638 clear_bit(_XEN_PCIB_active, (unsigned long *)&pdev->sh_info->flags);
639 notify_remote_via_evtchn(pdev->evtchn);
643 clear_bit(_PDEVB_op_active, &pdev->flags);
646 schedule_pcifront_aer_op(pdev);
652 struct pcifront_device *pdev = dev;
654 schedule_pcifront_aer_op(pdev);
657 static int pcifront_connect_and_init_dma(struct pcifront_device *pdev)
664 dev_info(&pdev->xdev->dev, "Installing PCI frontend\n");
665 pcifront_dev = pdev;
674 static void pcifront_disconnect(struct pcifront_device *pdev)
678 if (pdev == pcifront_dev) {
679 dev_info(&pdev->xdev->dev,
688 struct pcifront_device *pdev;
690 pdev = kzalloc(sizeof(struct pcifront_device), GFP_KERNEL);
691 if (pdev == NULL)
694 if (xenbus_setup_ring(xdev, GFP_KERNEL, (void **)&pdev->sh_info, 1,
695 &pdev->gnt_ref)) {
696 kfree(pdev);
697 pdev = NULL;
700 pdev->sh_info->flags = 0;
703 set_bit(_XEN_PCIB_AERHANDLER, (void *)&pdev->sh_info->flags);
705 dev_set_drvdata(&xdev->dev, pdev);
706 pdev->xdev = xdev;
708 INIT_LIST_HEAD(&pdev->root_buses);
710 spin_lock_init(&pdev->sh_info_lock);
712 pdev->evtchn = INVALID_EVTCHN;
713 pdev->irq = -1;
715 INIT_WORK(&pdev->op_work, pcifront_do_aer);
717 dev_dbg(&xdev->dev, "Allocated pdev @ 0x%p pdev->sh_info @ 0x%p\n",
718 pdev, pdev->sh_info);
720 return pdev;
723 static void free_pdev(struct pcifront_device *pdev)
725 dev_dbg(&pdev->xdev->dev, "freeing pdev @ 0x%p\n", pdev);
727 pcifront_free_roots(pdev);
729 cancel_work_sync(&pdev->op_work);
731 if (pdev->irq >= 0)
732 unbind_from_irqhandler(pdev->irq, pdev);
734 if (pdev->evtchn != INVALID_EVTCHN)
735 xenbus_free_evtchn(pdev->xdev, pdev->evtchn);
737 xenbus_teardown_ring((void **)&pdev->sh_info, 1, &pdev->gnt_ref);
739 dev_set_drvdata(&pdev->xdev->dev, NULL);
741 kfree(pdev);
744 static int pcifront_publish_info(struct pcifront_device *pdev)
749 err = xenbus_alloc_evtchn(pdev->xdev, &pdev->evtchn);
753 err = bind_evtchn_to_irqhandler(pdev->evtchn, pcifront_handler_aer,
754 0, "pcifront", pdev);
759 pdev->irq = err;
764 xenbus_dev_fatal(pdev->xdev, err,
770 err = xenbus_printf(trans, pdev->xdev->nodename,
771 "pci-op-ref", "%u", pdev->gnt_ref);
773 err = xenbus_printf(trans, pdev->xdev->nodename,
774 "event-channel", "%u", pdev->evtchn);
776 err = xenbus_printf(trans, pdev->xdev->nodename,
781 xenbus_dev_fatal(pdev->xdev, err,
789 xenbus_dev_fatal(pdev->xdev, err,
796 xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
798 dev_dbg(&pdev->xdev->dev, "publishing successful!\n");
804 static void pcifront_connect(struct pcifront_device *pdev)
811 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
814 xenbus_dev_error(pdev->xdev, err,
816 err = pcifront_rescan_root(pdev, 0, 0);
818 xenbus_dev_fatal(pdev->xdev, err,
824 xenbus_dev_fatal(pdev->xdev, err >= 0 ? -EINVAL : err,
834 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
837 xenbus_dev_fatal(pdev->xdev, err >= 0 ? -EINVAL : err,
842 err = pcifront_rescan_root(pdev, domain, bus);
844 xenbus_dev_fatal(pdev->xdev, err,
851 xenbus_switch_state(pdev->xdev, XenbusStateConnected);
854 static void pcifront_try_connect(struct pcifront_device *pdev)
859 if (xenbus_read_driver_state(pdev->xdev->nodename) !=
863 err = pcifront_connect_and_init_dma(pdev);
865 xenbus_dev_fatal(pdev->xdev, err,
870 pcifront_connect(pdev);
873 static int pcifront_try_disconnect(struct pcifront_device *pdev)
879 prev_state = xenbus_read_driver_state(pdev->xdev->nodename);
885 pcifront_free_roots(pdev);
886 pcifront_disconnect(pdev);
889 err = xenbus_switch_state(pdev->xdev, XenbusStateClosed);
896 static void pcifront_attach_devices(struct pcifront_device *pdev)
898 if (xenbus_read_driver_state(pdev->xdev->nodename) ==
900 pcifront_connect(pdev);
903 static int pcifront_detach_devices(struct pcifront_device *pdev)
912 state = xenbus_read_driver_state(pdev->xdev->nodename);
914 dev_dbg(&pdev->xdev->dev, "Handle skipped connect.\n");
916 err = pcifront_connect_and_init_dma(pdev);
918 xenbus_dev_fatal(pdev->xdev, err,
928 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, "num_devs", "%d",
933 xenbus_dev_fatal(pdev->xdev, err,
947 state = xenbus_read_unsigned(pdev->xdev->otherend, str,
959 err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
964 xenbus_dev_fatal(pdev->xdev, err,
972 dev_dbg(&pdev->xdev->dev,
982 dev_dbg(&pdev->xdev->dev,
988 err = xenbus_switch_state(pdev->xdev, XenbusStateReconfiguring);
997 struct pcifront_device *pdev = dev_get_drvdata(&xdev->dev);
1007 pcifront_try_connect(pdev);
1016 pcifront_try_disconnect(pdev);
1020 pcifront_detach_devices(pdev);
1024 pcifront_attach_devices(pdev);
1033 struct pcifront_device *pdev = alloc_pdev(xdev);
1035 if (pdev == NULL) {
1042 err = pcifront_publish_info(pdev);
1044 free_pdev(pdev);
1052 struct pcifront_device *pdev = dev_get_drvdata(&xdev->dev);
1054 if (pdev)
1055 free_pdev(pdev);