@@ -4169,6 +4169,7 @@ static void load_default_system_params(struct btd_adapter *adapter)
struct mgmt_tlv entry;
union {
uint16_t u16;
+ uint8_t u8;
};
} __packed *params;
uint16_t i = 0;
@@ -4436,6 +4437,15 @@ static void load_default_system_params(struct btd_adapter *adapter)
len += sizeof(params[i].u16);
}
+ if (main_opts.default_params.enable_advmon_interleave_scan != 0xFF) {
+ params[i].entry.type = 0x001f;
+ params[i].entry.length = sizeof(params[i].u8);
+ params[i].u8 =
+ main_opts.default_params.enable_advmon_interleave_scan;
+ ++i;
+ len += sizeof(params[i].u8);
+ }
+
err = mgmt_send(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
adapter->dev_id, len, params, NULL, NULL, NULL);
if (!err)
@@ -83,6 +83,7 @@ struct main_opts {
uint16_t advmon_allowlist_scan_duration;
uint16_t advmon_no_filter_scan_duration;
+ uint8_t enable_advmon_interleave_scan;
} default_params;
@@ -112,6 +112,7 @@ static const char *controller_options[] = {
"LEAutoconnecttimeout",
"AdvMonAllowlistScanDuration",
"AdvMonNoFilterScanDuration",
+ "EnableAdvMonInterleaveScan",
NULL
};
@@ -431,6 +432,10 @@ static void parse_controller_config(GKeyFile *config)
&main_opts.default_params.advmon_no_filter_scan_duration,
1,
10000},
+ { "EnableAdvMonInterleaveScan",
+ &main_opts.default_params.enable_advmon_interleave_scan,
+ 0,
+ 1},
};
uint16_t i;
@@ -698,6 +703,7 @@ static void init_defaults(void)
main_opts.default_params.num_entries = 0;
main_opts.default_params.br_page_scan_type = 0xFFFF;
main_opts.default_params.br_scan_type = 0xFFFF;
+ main_opts.default_params.enable_advmon_interleave_scan = 0xFF;
if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2)
return;
@@ -159,6 +159,12 @@
# Default: 500
#AdvMonNoFilterScanDuration=
+# Enable/Disable Advertisement Monitor interleave scan for power saving.
+# 0: disable
+# 1: enable
+# Defaults to 0
+#EnableAdvMonInterleaveScan=
+
[GATT]
# GATT attribute cache.
# Possible values: