|
@@ -1283,8 +1283,7 @@ static void spapr_dt_pci_device_cb(PCIBus *bus, PCIDevice *pdev,
|
|
PciWalkFdt *p = opaque;
|
|
PciWalkFdt *p = opaque;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- if (p->err) {
|
|
|
|
- /* Something's already broken, don't keep going */
|
|
|
|
|
|
+ if (p->err || !pdev->enabled) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1572,6 +1571,14 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
|
|
SpaprDrc *drc = drc_from_dev(phb, pdev);
|
|
SpaprDrc *drc = drc_from_dev(phb, pdev);
|
|
uint32_t slotnr = PCI_SLOT(pdev->devfn);
|
|
uint32_t slotnr = PCI_SLOT(pdev->devfn);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If DR or the PCI device is disabled we don't need to do anything
|
|
|
|
+ * in the case of hotplug or coldplug callbacks.
|
|
|
|
+ */
|
|
|
|
+ if (!pdev->enabled) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
g_assert(drc);
|
|
g_assert(drc);
|
|
|
|
|
|
if (IS_PCI_BRIDGE(plugged_dev)) {
|
|
if (IS_PCI_BRIDGE(plugged_dev)) {
|
|
@@ -1647,6 +1654,11 @@ static void spapr_pci_unplug_request(HotplugHandler *plug_handler,
|
|
SpaprDrc *drc = drc_from_dev(phb, pdev);
|
|
SpaprDrc *drc = drc_from_dev(phb, pdev);
|
|
|
|
|
|
g_assert(drc);
|
|
g_assert(drc);
|
|
|
|
+
|
|
|
|
+ if (!drc->dev) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
g_assert(drc->dev == plugged_dev);
|
|
g_assert(drc->dev == plugged_dev);
|
|
|
|
|
|
if (!spapr_drc_unplug_requested(drc)) {
|
|
if (!spapr_drc_unplug_requested(drc)) {
|