From: Alex Williamson <[email protected]> The mix_and_match test intentionally submits TX descriptors with an unmapped source IOVA so that the DMA read fails. By default the 82576 re-sends the request after a PCIe completion timeout (datasheet section 8.6.1, GCR.Completion_Timeout_Resend, bit 16, initial value 1b). On real hardware this turns a single fault into a stream of retried reads, keeping PCIe AER and IOMMU error handling busy and interfering with reset recovery.
Clear GCR.Completion_Timeout_Resend during device initialization so a failed read fails once and stays failed. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Alex Williamson <[email protected]> --- tools/testing/selftests/vfio/lib/drivers/igb/igb.c | 12 ++++++++++++ .../selftests/vfio/lib/drivers/igb/registers.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/tools/testing/selftests/vfio/lib/drivers/igb/igb.c b/tools/testing/selftests/vfio/lib/drivers/igb/igb.c index 879c21780f5b..89537f8345d1 100644 --- a/tools/testing/selftests/vfio/lib/drivers/igb/igb.c +++ b/tools/testing/selftests/vfio/lib/drivers/igb/igb.c @@ -209,6 +209,18 @@ static void igb_init(struct vfio_pci_device *device) vfio_pci_config_writew(device, PCI_COMMAND, cmd_reg); } + /* + * Disable DMA re-send on PCIe completion timeout (82576 datasheet + * section 8.6.1, GCR.Completion_Timeout_Resend, bit 16). The + * mix_and_match test intentionally submits descriptors targeting + * unmapped IOVAs; with the default (set) value, the device keeps + * retrying the failed read indefinitely, which keeps PCIe AER and + * IOMMU error handling busy and interferes with reset recovery. + */ + ctrl = igb_read32(igb, IGB_GCR); + ctrl &= ~IGB_GCR_CMPL_TMOUT_RESEND; + igb_write32(igb, IGB_GCR, ctrl); + /* Configure PHY internal loopback for testing. */ if (igb_setup_loopback(igb)) return; diff --git a/tools/testing/selftests/vfio/lib/drivers/igb/registers.h b/tools/testing/selftests/vfio/lib/drivers/igb/registers.h index a133a208ed08..3f04bcaa44ba 100644 --- a/tools/testing/selftests/vfio/lib/drivers/igb/registers.h +++ b/tools/testing/selftests/vfio/lib/drivers/igb/registers.h @@ -73,6 +73,8 @@ #define IGB_RAH0 0x05404 /* Receive Address High 0 */ #define IGB_VMOLR0 0x05AD0 /* VM Offload Layout Register 0 */ +#define IGB_GCR 0x05B00 /* PCIe Control */ +#define IGB_GCR_CMPL_TMOUT_RESEND BIT(16) /* Re-send on completion timeout */ #define IGB_VMOLR_LPE 0x00010000 /* Long Packet Enable */ #define IGB_VMOLR_BAM 0x08000000 /* Broadcast Accept Mode */ -- 2.54.0.794.g4f17f83d09-goog

