diff --git a/src/adapter.c b/src/adapter.c
index 21c1bb6..606affd 100644
--- a/src/adapter.c
+++ b/src/adapter.c
if (!adapter_remaining)
btd_exit();
}
+
+/*
+ * Check if workaround for broken ATT server socket behavior is needed
+ * where we need to connect an ATT client socket before pairing to get
+ * early access to the ATT channel.
+ */
+bool btd_le_connect_before_pairing(void)
+{
+ if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
+ return true;
+
+ return false;
+}
diff --git a/src/adapter.h b/src/adapter.h
index 8f4098a..737479f 100644
--- a/src/adapter.h
+++ b/src/adapter.h
void btd_adapter_for_each_device(struct btd_adapter *adapter,
void (*cb)(struct btd_device *device, void *data),
void *data);
+
+bool btd_le_connect_before_pairing(void);
diff --git a/src/device.c b/src/device.c
index 1499d1b..025743f 100644
--- a/src/device.c
+++ b/src/device.c
* this in the ATT connect callback)
*/
if (bdaddr_type != BDADDR_BREDR) {
- if (!state->connected)
+ if (!state->connected && btd_le_connect_before_pairing())
err = device_connect_le(device);
else
err = adapter_create_bonding(adapter, &device->bdaddr,