diff options
Diffstat (limited to 'hcid/device.c')
-rw-r--r-- | hcid/device.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/hcid/device.c b/hcid/device.c index b67f87a7..987fa0c0 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -131,10 +131,26 @@ int remove_device(uint16_t dev_id) return 0; } +static inline uint8_t get_inquiry_mode(struct hci_dev *dev) +{ + if (dev->manufacturer == 15 && + dev->hci_rev == 0x09 && dev->lmp_subver == 0x6963) + return 1; + + if (dev->features[6] & LMP_EXT_INQ) + return 2; + + if (dev->features[3] & LMP_RSSI_INQ) + return 1; + + return 0; +} + int start_device(uint16_t dev_id) { struct hci_dev *dev; struct hci_version ver; + uint8_t features[8], inqmode; int dd; ASSERT_DEV_ID; @@ -159,6 +175,22 @@ int start_device(uint16_t dev_id) dev->lmp_subver = ver.lmp_subver; dev->manufacturer = ver.manufacturer; + if (hci_read_local_features(dd, features, 1000) < 0) { + error("Can't read features for hci%d: %s (%d)", + dev_id, strerror(errno), errno); + return -errno; + } + + memcpy(dev->features, features, 8); + + inqmode = get_inquiry_mode(dev); + + if (hci_write_inquiry_mode(dd, inqmode, 1000) < 0) { + error("Can't write inquiry mode for hci%d: %s (%d)", + dev_id, strerror(errno), errno); + return -errno; + } + hci_close_dev(dd); info("Device hci%d has been activated", dev_id); |