powerpc/eeh: Reworked eeh_pe_bus_get()
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Tue, 9 Feb 2016 04:50:23 +0000 (15:50 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 8 Mar 2016 22:57:46 +0000 (09:57 +1100)
The original implementation is ugly: unnecessary if statements and
"out" tag. This reworks the function to avoid above weaknesses. No
functional changes introduced.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/eeh_pe.c

index 98f81800e00c1030b69c80d79eb8d43edbda9728..9066afc2b9dbee24910562b34f09bc0b1ff80418 100644 (file)
@@ -920,25 +920,21 @@ const char *eeh_pe_loc_get(struct eeh_pe *pe)
  */
 struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
 {
-       struct pci_bus *bus = NULL;
        struct eeh_dev *edev;
        struct pci_dev *pdev;
 
-       if (pe->type & EEH_PE_PHB) {
-               bus = pe->phb->bus;
-       } else if (pe->type & EEH_PE_BUS ||
-                  pe->type & EEH_PE_DEVICE) {
-               if (pe->state & EEH_PE_PRI_BUS) {
-                       bus = pe->bus;
-                       goto out;
-               }
+       if (pe->type & EEH_PE_PHB)
+               return pe->phb->bus;
 
-               edev = list_first_entry(&pe->edevs, struct eeh_dev, list);
-               pdev = eeh_dev_to_pci_dev(edev);
-               if (pdev)
-                       bus = pdev->bus;
-       }
+       /* The primary bus might be cached during probe time */
+       if (pe->state & EEH_PE_PRI_BUS)
+               return pe->bus;
+
+       /* Retrieve the parent PCI bus of first (top) PCI device */
+       edev = list_first_entry_or_null(&pe->edevs, struct eeh_dev, list);
+       pdev = eeh_dev_to_pci_dev(edev);
+       if (pdev)
+               return pdev->bus;
 
-out:
-       return bus;
+       return NULL;
 }