aboutsummaryrefslogtreecommitdiff
path: root/arch/s390/pci/pci_irq.c
diff options
context:
space:
mode:
authorNiklas Schnelle <[email protected]>2021-07-01 15:49:11 +0200
committerVasily Gorbik <[email protected]>2021-11-08 14:17:49 +0100
commitda995d538d3a17610d89fea0f5813cf7921b3c2c (patch)
tree5004af3a435a6546658bf78ecbc559a355aea055 /arch/s390/pci/pci_irq.c
parent4fe204977096e900cb91a3298b05c794ac24f540 (diff)
s390/pci: implement reset_slot for hotplug slot
This is done by adding a zpci_hot_reset_device() call which does a low level reset of the PCI function without changing its higher level function state. This way it can be used while the zPCI function is bound to a driver and with DMA tables being controlled either through the IOMMU or DMA APIs which is prohibited when using zpci_disable_device() as that drop existing DMA translations. As this reset, unlike a normal FLR, also calls zpci_clear_irq() we need to implement arch_restore_msi_irqs() and make sure we re-enable IRQs for the PCI function if they were previously disabled. Reviewed-by: Pierre Morel <[email protected]> Reviewed-by: Matthew Rosato <[email protected]> Signed-off-by: Niklas Schnelle <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
Diffstat (limited to 'arch/s390/pci/pci_irq.c')
-rw-r--r--arch/s390/pci/pci_irq.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/s390/pci/pci_irq.c b/arch/s390/pci/pci_irq.c
index 3823e159bf74..954bb7a83124 100644
--- a/arch/s390/pci/pci_irq.c
+++ b/arch/s390/pci/pci_irq.c
@@ -387,6 +387,15 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev)
airq_iv_free(zpci_ibv[0], zdev->msi_first_bit, zdev->msi_nr_irqs);
}
+void arch_restore_msi_irqs(struct pci_dev *pdev)
+{
+ struct zpci_dev *zdev = to_zpci(pdev);
+
+ if (!zdev->irqs_registered)
+ zpci_set_irq(zdev);
+ default_restore_msi_irqs(pdev);
+}
+
static struct airq_struct zpci_airq = {
.handler = zpci_floating_irq_handler,
.isc = PCI_ISC,