Commit fd5cee7c authored by Gavin Shan's avatar Gavin Shan Committed by Benjamin Herrenschmidt

powerpc/powernv: Reset root port in firmware

Resetting root port has more stuff to do than that for PCIe switch
ports and we should have resetting root port done in firmware instead
of the kernel itself. The problem was introduced by commit 5b2e198e
("powerpc/powernv: Rework EEH reset").

Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 54f112a3
...@@ -510,12 +510,10 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) ...@@ -510,12 +510,10 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option)
int ret; int ret;
/* /*
* The rules applied to reset, either fundamental or hot reset: * For PHB reset, we always have complete reset. For those PEs whose
* * primary bus derived from root complex (root bus) or root port
* We always reset the direct upstream bridge of the PE. If the * (usually bus#1), we apply hot or fundamental reset on the root port.
* direct upstream bridge isn't root bridge, we always take hot * For other PEs, we always have hot reset on the PE primary bus.
* reset no matter what option (fundamental or hot) is. Otherwise,
* we should do the reset according to the required option.
* *
* Here, we have different design to pHyp, which always clear the * Here, we have different design to pHyp, which always clear the
* frozen state during PE reset. However, the good idea here from * frozen state during PE reset. However, the good idea here from
...@@ -529,7 +527,8 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) ...@@ -529,7 +527,8 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option)
ret = ioda_eeh_phb_reset(hose, option); ret = ioda_eeh_phb_reset(hose, option);
} else { } else {
bus = eeh_pe_bus_get(pe); bus = eeh_pe_bus_get(pe);
if (pci_is_root_bus(bus)) if (pci_is_root_bus(bus) ||
pci_is_root_bus(bus->parent))
ret = ioda_eeh_root_reset(hose, option); ret = ioda_eeh_root_reset(hose, option);
else else
ret = ioda_eeh_bridge_reset(bus->self, option); ret = ioda_eeh_bridge_reset(bus->self, option);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment