Message ID | 20190403090920.362-5-oohall@gmail.com |
---|---|
State | RFC |
Headers | show |
Series | [RFC,01/23] platform/firenze-pci: Remove freset | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | warning | Failed to apply on branch master (050d8165ab05b6d9cdf4bfee42d9776969c77029) |
snowpatch_ozlabs/apply_patch | fail | Failed to apply to any branch |
Le 03/04/2019 à 11:09, Oliver O'Halloran a écrit : > Signed-off-by: Oliver O'Halloran <oohall@gmail.com> > --- > core/pci.c | 55 ++++++++++++++++-------------------------------------- > 1 file changed, 16 insertions(+), 39 deletions(-) > > diff --git a/core/pci.c b/core/pci.c > index a20268b18e1e..c1959197d06d 100644 > --- a/core/pci.c > +++ b/core/pci.c > @@ -365,7 +365,6 @@ static void pci_slot_set_power_state(struct phb *phb, > uint8_t state) > { > struct pci_slot *slot; > - uint8_t cur_state; > int32_t wait = 100; > int64_t rc; > > @@ -378,58 +377,36 @@ static void pci_slot_set_power_state(struct phb *phb, > !slot->ops.set_power_state) > return; > > - if (state == PCI_SLOT_POWER_OFF) { > - /* Bail if there're something connected */ > - if (!list_empty(&pd->children)) { > - PCIERR(phb, pd->bdfn, "Attempted to power off slot with attached devices!\n"); > - return; > - } > - > - pci_slot_add_flags(slot, PCI_SLOT_FLAG_BOOTUP); > - rc = slot->ops.get_power_state(slot, &cur_state); > - if (rc != OPAL_SUCCESS) { > - PCINOTICE(phb, pd->bdfn, "Error %lld getting slot power state\n", rc); > - cur_state = PCI_SLOT_POWER_OFF; > - } > - > - pci_slot_remove_flags(slot, PCI_SLOT_FLAG_BOOTUP); > - if (cur_state == PCI_SLOT_POWER_OFF) > - return; > + if (state == PCI_SLOT_POWER_OFF && !list_empty(&pd->children)) { > + PCIERR(phb, pd->bdfn, "Attempted to power off slot with attached devices!\n"); > + return; > } > > pci_slot_add_flags(slot, > (PCI_SLOT_FLAG_BOOTUP | PCI_SLOT_FLAG_ENFORCE)); > - rc = slot->ops.set_power_state(slot, state); > - if (rc == OPAL_SUCCESS) > - goto success; > - if (rc != OPAL_ASYNC_COMPLETION) { > - PCINOTICE(phb, pd->bdfn, "Error %lld powering %s slot\n", > - rc, state == PCI_SLOT_POWER_ON ? "on" : "off"); > - goto error; > - } > > /* Wait until the operation is completed */ > do { > - if (slot->state == PCI_SLOT_STATE_SPOWER_DONE) > + rc = slot->ops.set_power_state(slot, state); > + if (rc <= 0) > break; > - > + time_wait(rc > 10 ? 10 : rc); I think the intent is to use time_wait_ms() Fred > check_timers(false); > - time_wait_ms(10); > - } while (--wait >= 0); > + } while (--wait); > > - if (wait < 0) { > - PCINOTICE(phb, pd->bdfn, "Timeout powering %s slot\n", > - state == PCI_SLOT_POWER_ON ? "on" : "off"); > - goto error; > + if (!wait && rc >= 0) > + rc = OPAL_TIMEOUT; > + > + if (rc < 0) { > + PCIERR(phb, pd->bdfn, "Error %lld powering %s slot\n", > + rc, state == PCI_SLOT_POWER_ON ? "on" : "off"); > + } else { > + PCIDBG(phb, pd->bdfn, "Powered %s hotpluggable slot\n", > + state == PCI_SLOT_POWER_ON ? "on" : "off"); > } > > -success: > - PCIDBG(phb, pd->bdfn, "Powering %s hotpluggable slot\n", > - state == PCI_SLOT_POWER_ON ? "on" : "off"); > -error: > pci_slot_remove_flags(slot, > (PCI_SLOT_FLAG_BOOTUP | PCI_SLOT_FLAG_ENFORCE)); > - pci_slot_set_state(slot, PCI_SLOT_STATE_NORMAL); > } > > static int64_t pci_slot_get_link_width(struct pci_slot *slot) >
diff --git a/core/pci.c b/core/pci.c index a20268b18e1e..c1959197d06d 100644 --- a/core/pci.c +++ b/core/pci.c @@ -365,7 +365,6 @@ static void pci_slot_set_power_state(struct phb *phb, uint8_t state) { struct pci_slot *slot; - uint8_t cur_state; int32_t wait = 100; int64_t rc; @@ -378,58 +377,36 @@ static void pci_slot_set_power_state(struct phb *phb, !slot->ops.set_power_state) return; - if (state == PCI_SLOT_POWER_OFF) { - /* Bail if there're something connected */ - if (!list_empty(&pd->children)) { - PCIERR(phb, pd->bdfn, "Attempted to power off slot with attached devices!\n"); - return; - } - - pci_slot_add_flags(slot, PCI_SLOT_FLAG_BOOTUP); - rc = slot->ops.get_power_state(slot, &cur_state); - if (rc != OPAL_SUCCESS) { - PCINOTICE(phb, pd->bdfn, "Error %lld getting slot power state\n", rc); - cur_state = PCI_SLOT_POWER_OFF; - } - - pci_slot_remove_flags(slot, PCI_SLOT_FLAG_BOOTUP); - if (cur_state == PCI_SLOT_POWER_OFF) - return; + if (state == PCI_SLOT_POWER_OFF && !list_empty(&pd->children)) { + PCIERR(phb, pd->bdfn, "Attempted to power off slot with attached devices!\n"); + return; } pci_slot_add_flags(slot, (PCI_SLOT_FLAG_BOOTUP | PCI_SLOT_FLAG_ENFORCE)); - rc = slot->ops.set_power_state(slot, state); - if (rc == OPAL_SUCCESS) - goto success; - if (rc != OPAL_ASYNC_COMPLETION) { - PCINOTICE(phb, pd->bdfn, "Error %lld powering %s slot\n", - rc, state == PCI_SLOT_POWER_ON ? "on" : "off"); - goto error; - } /* Wait until the operation is completed */ do { - if (slot->state == PCI_SLOT_STATE_SPOWER_DONE) + rc = slot->ops.set_power_state(slot, state); + if (rc <= 0) break; - + time_wait(rc > 10 ? 10 : rc); check_timers(false); - time_wait_ms(10); - } while (--wait >= 0); + } while (--wait); - if (wait < 0) { - PCINOTICE(phb, pd->bdfn, "Timeout powering %s slot\n", - state == PCI_SLOT_POWER_ON ? "on" : "off"); - goto error; + if (!wait && rc >= 0) + rc = OPAL_TIMEOUT; + + if (rc < 0) { + PCIERR(phb, pd->bdfn, "Error %lld powering %s slot\n", + rc, state == PCI_SLOT_POWER_ON ? "on" : "off"); + } else { + PCIDBG(phb, pd->bdfn, "Powered %s hotpluggable slot\n", + state == PCI_SLOT_POWER_ON ? "on" : "off"); } -success: - PCIDBG(phb, pd->bdfn, "Powering %s hotpluggable slot\n", - state == PCI_SLOT_POWER_ON ? "on" : "off"); -error: pci_slot_remove_flags(slot, (PCI_SLOT_FLAG_BOOTUP | PCI_SLOT_FLAG_ENFORCE)); - pci_slot_set_state(slot, PCI_SLOT_STATE_NORMAL); } static int64_t pci_slot_get_link_width(struct pci_slot *slot)
Signed-off-by: Oliver O'Halloran <oohall@gmail.com> --- core/pci.c | 55 ++++++++++++++++-------------------------------------- 1 file changed, 16 insertions(+), 39 deletions(-)