All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
To: "linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>
Cc: Ping-Ke Shih <pkshih@realtek.com>
Subject: [PATCH rtw-next 5/5] wifi: rtw88: pci: Handle more RX interrupts for RTL8821AE
Date: Sat, 24 Oct 2026 02:05:16 +0300	[thread overview]
Message-ID: <4ba9e250-0c6d-49af-a4f2-22ff043374df@gmail.com> (raw)
In-Reply-To: <2033f1b1-fb12-4a04-aef4-923590e64463@gmail.com>

RTL8821AE can raise IMR_RDU (RX descriptor unavailable) and IMR_RXFOVW
(RX FIFO overflow). If they are not handled, RX stops. Based on the
vendor driver and rtlwifi, the way to handle these is the same as the
normal IMR_ROK, so do that.

Move irq_mask from struct rtw_pci to struct rtw_pci_gen in order to
enable these new interrupts only for RTL8821AE and RTL8812AE.

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
Perhaps moving irq_mask is not necessary. The RTL8822CE, RTL8822BE,
RTL8821CE, RTL8723DE, and RTL8814AE vendor drivers enable these
interrupts, so maybe they can be enabled for all the chips.
---
 drivers/net/wireless/realtek/rtw88/pci.c     | 41 +++++++++-----------
 drivers/net/wireless/realtek/rtw88/pci.h     |  3 +-
 drivers/net/wireless/realtek/rtw88/pci_old.c |  7 ++++
 3 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
index 35f45e3ede81..ee693395b8d3 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.c
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
@@ -373,20 +373,6 @@ static int rtw_pci_init(struct rtw_dev *rtwdev)
 	struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
 	int ret = 0;
 
-	rtwpci->irq_mask[0] = IMR_HIGHDOK |
-			      IMR_MGNTDOK |
-			      IMR_BKDOK |
-			      IMR_BEDOK |
-			      IMR_VIDOK |
-			      IMR_VODOK |
-			      IMR_ROK |
-			      IMR_BCNDMAINT_E |
-			      IMR_C2HCMD |
-			      0;
-	rtwpci->irq_mask[1] = IMR_TXFOVW |
-			      0;
-	rtwpci->irq_mask[3] = IMR_H2CDOK |
-			      0;
 	spin_lock_init(&rtwpci->irq_lock);
 	spin_lock_init(&rtwpci->hwirq_lock);
 	ret = rtw_pci_init_trx_ring(rtwdev);
@@ -482,15 +468,17 @@ static void rtw_pci_reset_trx_ring(struct rtw_dev *rtwdev)
 static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,
 				     struct rtw_pci *rtwpci, bool exclude_rx)
 {
+	const struct rtw_pci_gen *pci_gen = rtwpci->gen;
+	u32 imr0_unmask = exclude_rx ? IMR_ROK | IMR_RDU : 0;
+	u32 imr1_unmask = exclude_rx ? IMR_RXFOVW : 0;
 	unsigned long flags;
-	u32 imr0_unmask = exclude_rx ? IMR_ROK : 0;
 
 	spin_lock_irqsave(&rtwpci->hwirq_lock, flags);
 
-	rtw_write32(rtwdev, RTK_PCI_HIMR0, rtwpci->irq_mask[0] & ~imr0_unmask);
-	rtw_write32(rtwdev, RTK_PCI_HIMR1, rtwpci->irq_mask[1]);
+	rtw_write32(rtwdev, RTK_PCI_HIMR0, pci_gen->irq_mask[0] & ~imr0_unmask);
+	rtw_write32(rtwdev, RTK_PCI_HIMR1, pci_gen->irq_mask[1] & ~imr1_unmask);
 	if (rtw_chip_wcpu_3081(rtwdev))
-		rtw_write32(rtwdev, RTK_PCI_HIMR3, rtwpci->irq_mask[3]);
+		rtw_write32(rtwdev, RTK_PCI_HIMR3, pci_gen->irq_mask[3]);
 
 	rtwpci->irq_enabled = true;
 
@@ -1149,6 +1137,7 @@ static u32 rtw_pci_rx_napi(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
 static void rtw_pci_irq_recognized(struct rtw_dev *rtwdev,
 				   struct rtw_pci *rtwpci, u32 *irq_status)
 {
+	const struct rtw_pci_gen *pci_gen = rtwpci->gen;
 	unsigned long flags;
 
 	spin_lock_irqsave(&rtwpci->hwirq_lock, flags);
@@ -1159,9 +1148,9 @@ static void rtw_pci_irq_recognized(struct rtw_dev *rtwdev,
 		irq_status[3] = rtw_read32(rtwdev, RTK_PCI_HISR3);
 	else
 		irq_status[3] = 0;
-	irq_status[0] &= rtwpci->irq_mask[0];
-	irq_status[1] &= rtwpci->irq_mask[1];
-	irq_status[3] &= rtwpci->irq_mask[3];
+	irq_status[0] &= pci_gen->irq_mask[0];
+	irq_status[1] &= pci_gen->irq_mask[1];
+	irq_status[3] &= pci_gen->irq_mask[3];
 	rtw_write32(rtwdev, RTK_PCI_HISR0, irq_status[0]);
 	rtw_write32(rtwdev, RTK_PCI_HISR1, irq_status[1]);
 	if (rtw_chip_wcpu_3081(rtwdev))
@@ -1213,7 +1202,8 @@ static irqreturn_t rtw_pci_interrupt_threadfn(int irq, void *dev)
 		pci_gen->tx_isr(rtwdev, rtwpci, RTW_TX_QUEUE_VI);
 	if (irq_status[3] & IMR_H2CDOK)
 		pci_gen->tx_isr(rtwdev, rtwpci, RTW_TX_QUEUE_H2C);
-	if (irq_status[0] & IMR_ROK) {
+	if (irq_status[0] & (IMR_ROK | IMR_RDU) ||
+	    irq_status[1] & IMR_RXFOVW) {
 		rtw_pci_rx_isr(rtwdev);
 		rx = true;
 	}
@@ -2005,6 +1995,13 @@ const struct rtw_pci_gen rtw_pci_gen_new = {
 	.rx_napi = rtw_pci_rx_napi,
 	.clkreq_set = rtw_pci_clkreq_set,
 	.aspm_set = rtw_pci_aspm_set,
+
+	.irq_mask = { IMR_HIGHDOK | IMR_MGNTDOK | IMR_BKDOK |
+		      IMR_BEDOK | IMR_VIDOK | IMR_VODOK | IMR_ROK |
+		      IMR_BCNDMAINT_E | IMR_C2HCMD,
+		      IMR_TXFOVW,
+		      0,
+		      IMR_H2CDOK, }
 };
 EXPORT_SYMBOL(rtw_pci_gen_new);
 
diff --git a/drivers/net/wireless/realtek/rtw88/pci.h b/drivers/net/wireless/realtek/rtw88/pci.h
index 92532f842ebc..74074437e34b 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.h
+++ b/drivers/net/wireless/realtek/rtw88/pci.h
@@ -231,6 +231,8 @@ struct rtw_pci_gen {
 		       u8 hw_queue, u32 limit);
 	void (*clkreq_set)(struct rtw_dev *rtwdev, bool enable);
 	void (*aspm_set)(struct rtw_dev *rtwdev, bool enable);
+
+	u32 irq_mask[4];
 };
 
 struct rtw_pci {
@@ -241,7 +243,6 @@ struct rtw_pci {
 	spinlock_t hwirq_lock;
 	/* Used for PCI TX ring/queueing, and enable INT. */
 	spinlock_t irq_lock;
-	u32 irq_mask[4];
 	bool irq_enabled;
 	bool running;
 
diff --git a/drivers/net/wireless/realtek/rtw88/pci_old.c b/drivers/net/wireless/realtek/rtw88/pci_old.c
index 464b57d8a629..ef2da0adff37 100644
--- a/drivers/net/wireless/realtek/rtw88/pci_old.c
+++ b/drivers/net/wireless/realtek/rtw88/pci_old.c
@@ -518,5 +518,12 @@ const struct rtw_pci_gen rtw_pci_gen_old = {
 	.rx_napi = rtw_pci_old_rx_napi,
 	.clkreq_set = rtw_pci_old_clkreq_set,
 	.aspm_set = rtw_pci_old_aspm_set,
+
+	.irq_mask = { IMR_HIGHDOK | IMR_MGNTDOK | IMR_BKDOK |
+		      IMR_BEDOK | IMR_VIDOK | IMR_VODOK | IMR_ROK |
+		      IMR_BCNDMAINT_E | IMR_C2HCMD | IMR_RDU,
+		      IMR_TXFOVW | IMR_RXFOVW,
+		      0,
+		      0, }
 };
 EXPORT_SYMBOL(rtw_pci_gen_old);
-- 
2.55.0


  parent reply	other threads:[~2026-10-23 23:05 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-23 22:57 [PATCH rtw-next 0/5] wifi: rtw88: pci: Support an older design, like RTL8821AE/RTL8812AE Bitterblue Smith
2026-10-23 22:59 ` [PATCH rtw-next 1/5] wifi: rtw88: Pass RX buffer to rtw_rx_query_rx_desc() Bitterblue Smith
2026-10-23 23:00 ` [PATCH rtw-next 2/5] wifi: rtw88: Pass TX descriptor to rtw_tx_fill_tx_desc() Bitterblue Smith
2026-10-23 23:01 ` [PATCH rtw-next 3/5] wifi: rtw88: pci: Introduce struct rtw_pci_gen Bitterblue Smith
2026-10-24  8:41   ` Luka Gejak
2026-10-28 21:26     ` Bitterblue Smith
2026-10-23 23:02 ` [PATCH rtw-next 4/5] wifi: rtw88: pci: Add functions to support older chips Bitterblue Smith
2026-10-24  8:36   ` Luka Gejak
2026-10-28 17:40     ` Bitterblue Smith
2026-10-23 23:05 ` Bitterblue Smith [this message]
2026-10-27  1:52 ` [PATCH rtw-next 0/5] wifi: rtw88: pci: Support an older design, like RTL8821AE/RTL8812AE Ping-Ke Shih
2026-10-27  7:25   ` Luka Gejak
2026-10-27  8:07     ` Ping-Ke Shih
2026-10-28 17:41   ` Bitterblue Smith
2026-10-29  0:51     ` Ping-Ke Shih
2026-10-29  1:29       ` Ping-Ke Shih
2026-10-29 21:00       ` Bitterblue Smith

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4ba9e250-0c6d-49af-a4f2-22ff043374df@gmail.com \
    --to=rtl8821cerfe2@gmail.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=pkshih@realtek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.