From: Sanjay R Mehta Date: Fri, 6 Aug 2021 16:59:06 +0000 (-0500) Subject: thunderbolt: Handle ring interrupt by reading interrupt status register X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=7a1808f82a37d638ee6862175e8e5c5433fdd642;p=linux.git thunderbolt: Handle ring interrupt by reading interrupt status register 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 Signed-off-by: Sanjay R Mehta Signed-off-by: Mika Westerberg --- diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c index c7a2841ed3b7e..c73da0532be4f 100644 --- a/drivers/thunderbolt/nhi.c +++ b/drivers/thunderbolt/nhi.c @@ -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);