Messages in this thread | | | Subject | Re: [PATCH v8 1/2] PCI/ERR: Call pci_bus_reset() before calling ->slot_reset() callback | From | "Kuppuswamy, Sathyanarayanan" <> | Date | Fri, 13 Nov 2020 13:58:54 -0800 |
| |
Hi Bjorn,
On 10/26/20 12:37 PM, Kuppuswamy Sathyanarayanan wrote: > Currently if report_error_detected() or report_mmio_enabled() > functions requests PCI_ERS_RESULT_NEED_RESET, current > pcie_do_recovery() implementation does not do the requested > explicit device reset, but instead just calls the > report_slot_reset() on all affected devices. Notifying about the > reset via report_slot_reset() without doing the actual device > reset is incorrect. So call pci_bus_reset() before triggering > ->slot_reset() callback. Any comments on this series? > > Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > Reviewed-by: Sinan Kaya <okaya@kernel.org> > Reviewed-by: Ashok Raj <ashok.raj@intel.com> > --- > Changes since v7: > * Rebased on top of v5.10-rc1. > > Changes since v6: > * None. > > Changes since v5: > * Added Ashok's Reviewed-by tag. > > Changes since v4: > * Added check for pci_reset_bus() return value. > > drivers/pci/pcie/err.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c > index c543f419d8f9..315a4d559c4c 100644 > --- a/drivers/pci/pcie/err.c > +++ b/drivers/pci/pcie/err.c > @@ -152,6 +152,7 @@ pci_ers_result_t pcie_do_recovery(struct pci_dev *dev, > { > pci_ers_result_t status = PCI_ERS_RESULT_CAN_RECOVER; > struct pci_bus *bus; > + int ret; > > /* > * Error recovery runs on all subordinates of the first downstream port. > @@ -181,11 +182,12 @@ pci_ers_result_t pcie_do_recovery(struct pci_dev *dev, > } > > if (status == PCI_ERS_RESULT_NEED_RESET) { > - /* > - * TODO: Should call platform-specific > - * functions to reset slot before calling > - * drivers' slot_reset callbacks? > - */ > + ret = pci_reset_bus(dev); > + if (ret < 0) { > + pci_err(dev, "Failed to reset %d\n", ret); > + status = PCI_ERS_RESULT_DISCONNECT; > + goto failed; > + } > status = PCI_ERS_RESULT_RECOVERED; > pci_dbg(dev, "broadcast slot_reset message\n"); > pci_walk_bus(bus, report_slot_reset, &status); >
-- Sathyanarayanan Kuppuswamy Linux Kernel Developer
| |