Run some TR NOOP commands through the transfer ring.

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
 tests/qtest/usb-hcd-xhci-test.c | 36 +++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/tests/qtest/usb-hcd-xhci-test.c b/tests/qtest/usb-hcd-xhci-test.c
index 39c5c36e940..7f801f8f1a0 100644
--- a/tests/qtest/usb-hcd-xhci-test.c
+++ b/tests/qtest/usb-hcd-xhci-test.c
@@ -753,9 +753,29 @@ static ssize_t xhci_submit_scsi_cmd(XHCIQState *s,
 
 static void xhci_test_msd(XHCIQState *s)
 {
+    XHCITRB trb;
+    uint64_t tag;
     uint8_t scsi_cmd[16];
     g_autofree void *mem = g_malloc0(0x1000); /* buffer for writing to guest */
 
+    /* Issue a transfer ring ep 2 noop */
+    memset(&trb, 0, TRB_SIZE);
+    trb.control |= TR_NOOP << TRB_TYPE_SHIFT;
+    trb.control |= TRB_TR_IOC;
+    tag = submit_tr_trb(s, s->slotid, 2, &trb);
+    wait_event_trb(s, &trb);
+    g_assert_cmphex(trb.parameter, ==, tag);
+    g_assert_cmpint(TRB_TYPE(trb), ==, ER_TRANSFER);
+
+    /* Issue a transfer ring ep 3 noop */
+    memset(&trb, 0, TRB_SIZE);
+    trb.control |= TR_NOOP << TRB_TYPE_SHIFT;
+    trb.control |= TRB_TR_IOC;
+    tag = submit_tr_trb(s, s->slotid, 3, &trb);
+    wait_event_trb(s, &trb);
+    g_assert_cmphex(trb.parameter, ==, tag);
+    g_assert_cmpint(TRB_TYPE(trb), ==, ER_TRANSFER);
+
     /* Clear SENSE data */
     memset(scsi_cmd, 0, sizeof(scsi_cmd));
     scsi_cmd[0] = INQUIRY;
@@ -821,6 +841,22 @@ static void test_xhci_stress_rings(const void *arg)
         g_assert_cmpint(TRB_TYPE(trb), ==, ER_COMMAND_COMPLETE);
     }
 
+    if (qtest_has_device("usb-storage")) {
+        xhci_enable_slot(s);
+
+        /* Wrap the transfer ring a few times */
+        for (i = 0; i < 100; i++) {
+            /* Issue a transfer ring ep 0 noop */
+            memset(&trb, 0, TRB_SIZE);
+            trb.control |= TR_NOOP << TRB_TYPE_SHIFT;
+            trb.control |= TRB_TR_IOC;
+            tag = submit_tr_trb(s, s->slotid, 0, &trb);
+            wait_event_trb(s, &trb);
+            g_assert_cmphex(trb.parameter, ==, tag);
+            g_assert_cmpint(TRB_TYPE(trb), ==, ER_TRANSFER);
+        }
+    }
+
     xhci_disable_device(s);
     xhci_shutdown(s);
 }
-- 
2.47.1


Reply via email to