diff mbox series

[RFC,04/23] core/pci: Convert set_power_state

Message ID 20190403090920.362-5-oohall@gmail.com
State RFC
Headers show
Series [RFC,01/23] platform/firenze-pci: Remove freset | expand

Checks

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

Commit Message

Oliver O'Halloran April 3, 2019, 9:09 a.m. UTC
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
---
 core/pci.c | 55 ++++++++++++++++--------------------------------------
 1 file changed, 16 insertions(+), 39 deletions(-)

Comments

Frederic Barrat July 31, 2019, 7:31 p.m. UTC | #1
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 mbox series

Patch

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)