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


Reply via email to