|
@@ -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 *eeh_pe_bus_get(struct eeh_pe *pe)
|
|
{
|
|
{
|
|
- struct pci_bus *bus = NULL;
|
|
|
|
struct eeh_dev *edev;
|
|
struct eeh_dev *edev;
|
|
struct pci_dev *pdev;
|
|
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;
|
|
}
|
|
}
|