On 02/21/2018 11:46 PM, Oza Pawandeep wrote: > Implement error_resume callback in DPC so, after DPC trigger event > enumerates the devices beneath. > > Signed-off-by: Oza Pawandeep <poza@xxxxxxxxxxxxxx> > > diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c > index fce4518..59c01c7 100644 > --- a/drivers/pci/pcie/pcie-dpc.c > +++ b/drivers/pci/pcie/pcie-dpc.c > @@ -129,6 +129,23 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc) > } > > /** > + * dpc_error_resume - enumerate the devices beneath > + * @dev: pointer to Root Port's pci_dev data structure * @pdev: ... > + * > + * Invoked by Port Bus driver during nonfatal recovery. > + */ > +static void dpc_error_resume(struct pci_dev *pdev) > +{ > + bool active = true; > + > + if (pci_wait_for_link(pdev, active)) { > + pci_lock_rescan_remove(); > + pci_rescan_bus(pdev->bus); > + pci_unlock_rescan_remove(); > + } > +} > + > +/** > * dpc_reset_link - reset link DPC routine > * @dev: pointer to Root Port's pci_dev data structure > * > diff --git a/drivers/pci/pcie/pcie-err.c b/drivers/pci/pcie/pcie-err.c > index 6844347..4950f49 100644 > --- a/drivers/pci/pcie/pcie-err.c > +++ b/drivers/pci/pcie/pcie-err.c > @@ -256,6 +258,15 @@ static pci_ers_result_t broadcast_error_message(struct pci_dev *dev, > result_data.result = PCI_ERS_RESULT_RECOVERED; > > if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { > + /* If DPC is triggered, call resume error hanlder handler Kernel multi-line comment style is: /* * Begin comment here. * foo bar blah */ > + * because, at this point we can safely assume that > + * link recovery has happened. > + */ > + if ((severity == DPC_FATAL) && > + (cb == report_resume)) { > + cb(dev, NULL); > + return PCI_ERS_RESULT_RECOVERED; > + } > /* > * If the error is reported by a bridge, we think this error > * is related to the downstream link of the bridge, so we thanks, -- ~Randy