From: Kiran K <kiran.k@intel.com>
To: linux-bluetooth@vger.kernel.org
Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com,
Kiran K <kiran.k@intel.com>
Subject: [PATCH v2 2/3] Bluetooth: btintel_pcie: sync mbox tlv parsing with GP0 alive interrupt
Date: Wed, 19 Aug 2026 20:02:18 +0530 [thread overview]
Message-ID: <20260819143219.22728-2-kiran.k@intel.com> (raw)
In-Reply-To: <20260819143219.22728-1-kiran.k@intel.com>
Performing a target access to read the mbox TLV table while the driver
is concurrently posting RX buffers to the firmware causes the hardware
to return 0 for the target address, resulting in an invalid/empty TLV
parse.
Add a synchronization handshake between the mbox TLV read operation
performed by the mbox worker and the GP0 (alive) MSI-X interrupt (which
signals completion of RX buffer posting). The worker now waits for the
alive interrupt before initiating the target access, ensuring the
hardware returns valid data.
Assisted-by: Gemini:gemini-3.1-pro-preview
Signed-off-by: Kiran K <kiran.k@intel.com>
---
changes in v2:
- No code change
drivers/bluetooth/btintel_pcie.c | 42 +++++++++++++++++++++++++++++---
drivers/bluetooth/btintel_pcie.h | 10 +++++++-
2 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/drivers/bluetooth/btintel_pcie.c b/drivers/bluetooth/btintel_pcie.c
index 4d1b6e9a2bdc..bbce41b5b376 100644
--- a/drivers/bluetooth/btintel_pcie.c
+++ b/drivers/bluetooth/btintel_pcie.c
@@ -987,6 +987,24 @@ static int btintel_parse_mbox_tlv(struct btintel_pcie_data *data)
struct mbox_tlv *tlv;
struct btintel_data *cnvi_data = hci_get_priv(data->hdev);
u8 hw_variant = INTEL_HW_VARIANT(cnvi_data->cnvi_bt);
+ long t;
+
+ /* Wait for GP0 alive interrupt to post RX buffers */
+ t = wait_event_timeout(data->mbox_parse_wait_q,
+ test_bit(BTINTEL_PCIE_MBOX_PARSE_READY, &data->flags),
+ msecs_to_jiffies(BTINTEL_PCIE_MBOX_INTR_TIMEOUT_MS));
+ if (!t) {
+ bt_dev_warn(data->hdev,
+ "Timeout (%u ms) waiting for alive interrupt before mbox TLV parse; skipping",
+ BTINTEL_PCIE_MBOX_INTR_TIMEOUT_MS);
+ return 0;
+ }
+ clear_bit(BTINTEL_PCIE_MBOX_PARSE_READY, &data->flags);
+
+ bt_dev_info(data->hdev,
+ "mbox TLV parse started at %lld ns (%lld us after mbox interrupt)",
+ ktime_to_ns(ktime_get()),
+ ktime_to_us(ktime_sub(ktime_get(), data->mbox_intr_ts)));
memset(&data->dump_info, 0, sizeof(data->dump_info));
@@ -1230,12 +1248,22 @@ static void btintel_pcie_msix_gp1_handler(struct btintel_pcie_data *data)
if (target_access &&
!test_and_set_bit(BTINTEL_PCIE_MAIL_BOX_INTR,
&data->flags)) {
+ /* Arm the mbox<->alive handshake */
+ clear_bit(BTINTEL_PCIE_MBOX_PARSE_READY, &data->flags);
+ set_bit(BTINTEL_PCIE_MBOX_PARSE_PENDING, &data->flags);
+ data->mbox_intr_ts = ktime_get();
+
+ bt_dev_info(data->hdev,
+ "mbox interrupt received at %lld ns; queuing mbox_work",
+ ktime_to_ns(data->mbox_intr_ts));
+
WRITE_ONCE(data->debug_table_addr, addr);
WRITE_ONCE(data->debug_table_size, size);
if (!queue_work(data->dump_workqueue,
- &data->mbox_work))
- clear_bit(BTINTEL_PCIE_MAIL_BOX_INTR,
- &data->flags);
+ &data->mbox_work)) {
+ clear_bit(BTINTEL_PCIE_MAIL_BOX_INTR, &data->flags);
+ clear_bit(BTINTEL_PCIE_MBOX_PARSE_PENDING, &data->flags);
+ }
}
/* Mailbox is read, ack to FW */
@@ -1345,6 +1373,12 @@ static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data)
if (submit_rx) {
btintel_pcie_reset_ia(data);
btintel_pcie_start_rx(data);
+
+ /* Complete the mbox<->alive handshake */
+ if (test_and_clear_bit(BTINTEL_PCIE_MBOX_PARSE_PENDING, &data->flags)) {
+ set_bit(BTINTEL_PCIE_MBOX_PARSE_READY, &data->flags);
+ wake_up(&data->mbox_parse_wait_q);
+ }
}
if (signal_waitq) {
@@ -3301,6 +3335,8 @@ static int btintel_pcie_probe(struct pci_dev *pdev,
init_waitqueue_head(&data->tx_wait_q);
data->tx_wait_done = false;
+ init_waitqueue_head(&data->mbox_parse_wait_q);
+
data->workqueue = alloc_ordered_workqueue(KBUILD_MODNAME, WQ_HIGHPRI);
if (!data->workqueue)
return -ENOMEM;
diff --git a/drivers/bluetooth/btintel_pcie.h b/drivers/bluetooth/btintel_pcie.h
index 5ceb2ba1276f..5aff1dfa888f 100644
--- a/drivers/bluetooth/btintel_pcie.h
+++ b/drivers/bluetooth/btintel_pcie.h
@@ -125,7 +125,9 @@ enum {
BTINTEL_PCIE_FWTRIGGER_DUMP_INPROGRESS,
BTINTEL_PCIE_RECOVERY_IN_PROGRESS,
BTINTEL_PCIE_SETUP_DONE,
- BTINTEL_PCIE_MAIL_BOX_INTR
+ BTINTEL_PCIE_MAIL_BOX_INTR,
+ BTINTEL_PCIE_MBOX_PARSE_PENDING,
+ BTINTEL_PCIE_MBOX_PARSE_READY
};
enum btintel_pcie_tlv_type {
@@ -178,6 +180,7 @@ enum btintel_pcie_mbox_msg {
/* Default interrupt timeout in msec */
#define BTINTEL_DEFAULT_INTR_TIMEOUT_MS 3000
+#define BTINTEL_PCIE_MBOX_INTR_TIMEOUT_MS 500
#define BTINTEL_PCIE_DX_TRANSITION_MAX_RETRIES 3
@@ -588,6 +591,11 @@ struct btintel_pcie_data {
u32 debug_table_size;
struct btintel_pcie_dump_mem_info dump_info;
struct btintel_pcie_mbox mbox;
+
+ /* Wait queue for mbox_worker to wait for GP0 alive interrupt */
+ wait_queue_head_t mbox_parse_wait_q;
+ /* Timestamp captured in GP1 handler when mbox interrupt is received */
+ ktime_t mbox_intr_ts;
};
static inline u32 btintel_pcie_rd_reg32(struct btintel_pcie_data *data,
--
2.54.0
next prev parent reply other threads:[~2026-08-19 14:12 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 14:32 [PATCH v2 1/3] Bluetooth: btintel_pcie: parse FW memory addresses via mailbox TLV Kiran K
2026-08-19 14:32 ` Kiran K [this message]
2026-08-19 14:32 ` [PATCH v2 3/3] Bluetooth: btintel_pcie: Route debug traces to WiFi DBGC by default Kiran K
2026-08-19 15:19 ` [v2,1/3] Bluetooth: btintel_pcie: parse FW memory addresses via mailbox TLV bluez.test.bot
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=20260819143219.22728-2-kiran.k@intel.com \
--to=kiran.k@intel.com \
--cc=chethan.tumkur.narayan@intel.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=ravishankar.srivatsa@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox