From: StefanCondorache <condorachest@gmail.com>
To: linux-bluetooth@vger.kernel.org
Cc: luiz.dentz@gmail.com, StefanCondorache <condorachest@gmail.com>
Subject: [PATCH] adapter: add DisableDiscoveryOnConnect option for combo chip coexistence
Date: Sat, 18 Apr 2026 17:11:27 +0300 [thread overview]
Message-ID: <20260418141127.243863-1-condorachest@gmail.com> (raw)
On systems with combo chips (shared Wi-Fi/Bluetooth antenna), background
LE scanning for auto-connect devices competes with active connections,
causing audio stuttering and Wi-Fi packet loss due to antenna
multiplexing via Packet Traffic Arbitration (PTA).
Add a DisableDiscoveryOnConnect boolean option to the [General] section
of main.conf. When enabled and an active connection exists, the option
suppresses adding devices to the kernel auto-connect list in
adapter_auto_connect_add() on kernels supporting KERNEL_CONN_CONTROL,
and gates trigger_passive_scanning() on older kernels.
The option defaults to false to preserve existing behavior.
Signed-off-by: StefanCondorache <condorachest@gmail.com>
---
src/adapter.c | 24 ++++++++++++++++++++++++
src/btd.h | 2 ++
src/main.c | 4 ++++
src/main.conf | 6 ++++++
4 files changed, 36 insertions(+)
diff --git a/src/adapter.c b/src/adapter.c
index 6df66b3e0..4a18adfe0 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1594,6 +1594,18 @@ static void trigger_passive_scanning(struct btd_adapter *adapter)
if (!adapter->connect_list)
return;
+ /*
+ * If the user has enabled DisableDiscoveryOnConnect, suppress
+ * passive scanning whenever there is at least one active connection.
+ * This prevents antenna multiplexing conflicts on combo chips where
+ * Wi-Fi and Bluetooth share the same 2.4 GHz radio, which causes
+ * audio drops and Wi-Fi packet loss during background scans.
+ */
+ if (btd_opts.disable_discovery_on_connect && adapter->connections) {
+ DBG("suppress passive scan: active connection present");
+ return;
+ }
+
adapter->passive_scan_timeout = timeout_add_seconds(CONN_SCAN_TIMEOUT,
passive_scanning_timeout, adapter,
NULL);
@@ -5717,6 +5729,18 @@ void adapter_auto_connect_add(struct btd_adapter *adapter,
return;
}
+ /*
+ * If DisableDiscoveryOnConnect is enabled, suppress adding devices
+ * to the kernel auto-connect list while an active connection exists.
+ * On combo chips (shared Wi-Fi/Bluetooth antenna), the kernel's
+ * background scanning for auto-connect devices competes with active
+ * connections, causing audio drops and Wi-Fi packet loss.
+ */
+ if (btd_opts.disable_discovery_on_connect && adapter->connections) {
+ DBG("suppress kernel auto-connect: active connection present");
+ return;
+ }
+
bdaddr = device_get_address(device);
bdaddr_type = btd_device_get_bdaddr_type(device);
diff --git a/src/btd.h b/src/btd.h
index c84a600d1..07c4d85ba 100644
--- a/src/btd.h
+++ b/src/btd.h
@@ -144,6 +144,8 @@ struct btd_opts {
bool experimental;
bool testing;
bool filter_discoverable;
+ bool disable_discovery_on_connect;
+
struct queue *kernel;
uint16_t did_source;
diff --git a/src/main.c b/src/main.c
index 818f7c06e..d7ddf5643 100644
--- a/src/main.c
+++ b/src/main.c
@@ -92,6 +92,7 @@ static const char *supported_options[] = {
"KernelExperimental",
"RemoteNameRequestRetryDelay",
"FilterDiscoverable",
+ "DisableDiscoveryOnConnect",
NULL
};
@@ -1072,6 +1073,8 @@ static void parse_general(GKeyFile *config)
0, UINT32_MAX);
parse_config_bool(config, "General", "FilterDiscoverable",
&btd_opts.filter_discoverable);
+ parse_config_bool(config, "General", "DisableDiscoveryOnConnect",
+ &btd_opts.disable_discovery_on_connect);
}
static void parse_gatt_cache(GKeyFile *config)
@@ -1283,6 +1286,7 @@ static void init_defaults(void)
btd_opts.name_request_retry_delay = DEFAULT_NAME_REQUEST_RETRY_DELAY;
btd_opts.secure_conn = SC_ON;
btd_opts.filter_discoverable = true;
+ btd_opts.disable_discovery_on_connect = false;
btd_opts.defaults.num_entries = 0;
btd_opts.defaults.br.page_scan_type = 0xFFFF;
diff --git a/src/main.conf b/src/main.conf
index d31dd1b8f..22507c465 100644
--- a/src/main.conf
+++ b/src/main.conf
@@ -157,6 +157,12 @@
# some stacks) or when testing bad/unintended behavior.
#FilterDiscoverable = true
+# Disables background LE passive scanning when an active connection is
+# established. Recommended for combo chips (shared Wi-Fi/Bluetooth antenna)
+# to prevent audio stuttering and packet loss caused by antenna multiplexing.
+# Defaults to false.
+#DisableDiscoveryOnConnect = false
+
[BR]
# The following values are used to load default adapter parameters for BR/EDR.
# BlueZ loads the values into the kernel before the adapter is powered if the
--
2.53.0
next reply other threads:[~2026-04-18 14:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-18 14:11 StefanCondorache [this message]
2026-04-18 15:47 ` adapter: add DisableDiscoveryOnConnect option for combo chip coexistence bluez.test.bot
-- strict thread matches above, loose matches on Subject: below --
2026-04-18 13:27 [PATCH] " StefanCondorache
2026-04-19 2:28 ` Luiz Augusto von Dentz
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=20260418141127.243863-1-condorachest@gmail.com \
--to=condorachest@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.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