thunderbolt: Handle ring interrupt by reading interrupt status register
authorSanjay R Mehta <sanju.mehta@amd.com>
Fri, 6 Aug 2021 16:59:06 +0000 (11:59 -0500)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 9 Aug 2021 11:58:29 +0000 (14:58 +0300)
As per USB4 specification by default "Disable ISR Auto-Clear" bit is set
to zero and the Tx/Rx ring interrupt status needs to be cleared.

Hence handle it by reading the interrupt status register (ISR) in the
MSI-X handler.

Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/nhi.c

index c7a2841..c73da05 100644 (file)
@@ -382,11 +382,24 @@ void tb_ring_poll_complete(struct tb_ring *ring)
 }
 EXPORT_SYMBOL_GPL(tb_ring_poll_complete);
 
+static void ring_clear_msix(const struct tb_ring *ring)
+{
+       if (ring->nhi->quirks & QUIRK_AUTO_CLEAR_INT)
+               return;
+
+       if (ring->is_tx)
+               ioread32(ring->nhi->iobase + REG_RING_NOTIFY_BASE);
+       else
+               ioread32(ring->nhi->iobase + REG_RING_NOTIFY_BASE +
+                        4 * (ring->nhi->hop_count / 32));
+}
+
 static irqreturn_t ring_msix(int irq, void *data)
 {
        struct tb_ring *ring = data;
 
        spin_lock(&ring->nhi->lock);
+       ring_clear_msix(ring);
        spin_lock(&ring->lock);
        __ring_interrupt(ring);
        spin_unlock(&ring->lock);