On Sat, Jan 24, 2026 at 03:45:56PM +0800, Shuai Xue wrote:
> The DPC driver clears AER fatal status for the port that reported the
> error, but not for the downstream device that deteced the error. The
> current recovery code only clears non-fatal AER status, leaving fatal
> status bits set in the error device.
That's not quite accurate:
The error device has undergone a Hot Reset as a result of the Link Down
event. To be able to use it again, pci_restore_state() is invoked by
the driver's ->slot_reset() callback. And pci_restore_state() does
clear fatal status bits.
pci_restore_state()
pci_aer_clear_status()
pci_aer_raw_clear_status()
> Use pci_aer_raw_clear_status() to clear both fatal and non-fatal error
> status in the error device, ensuring all AER status bits are properly
> cleared after recovery.
Well, pci_restore_state() already clears all AER status bits so why
is this patch necessary?
> +++ b/drivers/pci/pcie/err.c
> @@ -285,7 +285,7 @@ pci_ers_result_t pcie_do_recovery(struct pci_dev *dev,
> */
> if (host->native_aer || pcie_ports_native) {
> pcie_clear_device_status(dev);
> - pci_aer_clear_nonfatal_status(dev);
> + pci_aer_raw_clear_status(dev);
> }
This code path is for the case when pcie_do_recovery() is called
with state=pci_channel_io_normal, i.e. in the nonfatal case.
That's why only the nonfatal bits need to be cleared here.
In the fatal case clearing of the error bits is done by
pci_restore_state().
I understand that this is subtle and should probably be changed
to improve clarity, but this patch doesn't look like a step
in that direction.
Thanks,
Lukas