fix thunderbolt ring-interrupt not being masked on suspend
Originally for v6.4-rc7 and now it also got already into some stable trees, but not yet into a (released) ubuntu tag – so backport it already. Link: https://forum.proxmox.com/threads/133104/post-590457 Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
ea64c38da4
commit
d772676031
@ -0,0 +1,49 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
Date: Tue, 30 May 2023 08:48:29 +0300
|
||||
Subject: [PATCH] thunderbolt: Mask ring interrupt on Intel hardware as well
|
||||
|
||||
When resuming from system sleep states the driver issues following
|
||||
warning on Intel hardware:
|
||||
|
||||
thunderbolt 0000:07:00.0: interrupt for TX ring 0 is already enabled
|
||||
|
||||
The reason for this is that the commit in question did not mask the ring
|
||||
interrupt on Intel hardware leaving the interrupt active. Fix this by
|
||||
masking it also in Intel hardware.
|
||||
|
||||
Reported-by: beld zhang <beldzhang@gmail.com>
|
||||
Tested-by: beld zhang <beldzhang@gmail.com>
|
||||
Closes: https://lore.kernel.org/linux-usb/ZHKW5NeabmfhgLbY@debian.me/
|
||||
Fixes: c4af8e3fecd0 ("thunderbolt: Clear registers properly when auto clear isn't in use")
|
||||
Cc: stable@vger.kernel.org
|
||||
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
(cherry picked from commit 9f9666e65359d5047089aef97ac87c50f624ecb0)
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
drivers/thunderbolt/nhi.c | 11 ++++++++---
|
||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
|
||||
index 0a525f44ea31..4a6a3802d7e5 100644
|
||||
--- a/drivers/thunderbolt/nhi.c
|
||||
+++ b/drivers/thunderbolt/nhi.c
|
||||
@@ -56,9 +56,14 @@ static int ring_interrupt_index(const struct tb_ring *ring)
|
||||
|
||||
static void nhi_mask_interrupt(struct tb_nhi *nhi, int mask, int ring)
|
||||
{
|
||||
- if (nhi->quirks & QUIRK_AUTO_CLEAR_INT)
|
||||
- return;
|
||||
- iowrite32(mask, nhi->iobase + REG_RING_INTERRUPT_MASK_CLEAR_BASE + ring);
|
||||
+ if (nhi->quirks & QUIRK_AUTO_CLEAR_INT) {
|
||||
+ u32 val;
|
||||
+
|
||||
+ val = ioread32(nhi->iobase + REG_RING_INTERRUPT_BASE + ring);
|
||||
+ iowrite32(val & ~mask, nhi->iobase + REG_RING_INTERRUPT_BASE + ring);
|
||||
+ } else {
|
||||
+ iowrite32(mask, nhi->iobase + REG_RING_INTERRUPT_MASK_CLEAR_BASE + ring);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void nhi_clear_interrupt(struct tb_nhi *nhi, int ring)
|
Loading…
Reference in New Issue
Block a user