summaryrefslogtreecommitdiff
path: root/src/adapter.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-05-12 16:40:49 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-05-12 16:58:52 -0700
commit7a4b67f9caa6bdc004c910f3a52108744a8cab74 (patch)
tree17e507934304229e37b2625064f5f767ca3db762 /src/adapter.c
parent83497bbb307fcc6eb7f11e996c9bfdbd97147a7e (diff)
downloadbluez-7a4b67f9caa6bdc004c910f3a52108744a8cab74.tar.gz
device: Fix enabling wake support without RPA Resolution
If device uses RPA it shall only enable wakeup if RPA Resolution has been enabled otherwise it cannot be programmed in the acceptlist which can cause suspend to fail. Link: https://bugzilla.kernel.org/show_bug.cgi?id=215768
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/adapter.c b/src/adapter.c
index db2624c60..f7faaa263 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -4761,6 +4761,9 @@ static void load_devices(struct btd_adapter *adapter)
if (!device)
goto free;
+ if (irk_info)
+ device_set_rpa(device, true);
+
btd_device_set_temporary(device, false);
adapter_add_device(adapter, device);
@@ -9569,8 +9572,9 @@ static bool set_blocked_keys(struct btd_adapter *adapter)
adapter, NULL);
}
-#define EXP_FEAT(_uuid, _func) \
+#define EXP_FEAT(_flag, _uuid, _func) \
{ \
+ .flag = _flag, \
.uuid = _uuid, \
.func = _func, \
}
@@ -9692,15 +9696,18 @@ static void codec_offload_func(struct btd_adapter *adapter, uint8_t action)
}
static const struct exp_feat {
+ uint32_t flag;
const struct mgmt_exp_uuid *uuid;
void (*func)(struct btd_adapter *adapter, uint8_t action);
} exp_table[] = {
- EXP_FEAT(&debug_uuid, exp_debug_func),
- EXP_FEAT(&le_simult_central_peripheral_uuid,
+ EXP_FEAT(EXP_FEAT_DEBUG, &debug_uuid, exp_debug_func),
+ EXP_FEAT(EXP_FEAT_LE_SIMULT_ROLES, &le_simult_central_peripheral_uuid,
le_simult_central_peripheral_func),
- EXP_FEAT(&quality_report_uuid, quality_report_func),
- EXP_FEAT(&rpa_resolution_uuid, rpa_resolution_func),
- EXP_FEAT(&codec_offload_uuid, codec_offload_func),
+ EXP_FEAT(EXP_FEAT_BQR, &quality_report_uuid, quality_report_func),
+ EXP_FEAT(EXP_FEAT_RPA_RESOLUTION, &rpa_resolution_uuid,
+ rpa_resolution_func),
+ EXP_FEAT(EXP_FEAT_CODEC_OFFLOAD, &codec_offload_uuid,
+ codec_offload_func),
};
static void read_exp_features_complete(uint8_t status, uint16_t length,
@@ -10451,3 +10458,18 @@ bool btd_has_kernel_features(uint32_t features)
{
return (kernel_features & features) ? true : false;
}
+
+bool btd_adapter_has_exp_feature(struct btd_adapter *adapter, uint32_t feature)
+{
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(exp_table); i++) {
+ const struct exp_feat *feat = &exp_table[i];
+
+ if ((feat->flag & feature) && queue_find(adapter->exps, NULL,
+ feat->uuid->val))
+ return true;
+ }
+
+ return false;
+}