Lines Matching refs:hdev
243 static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data, in mgmt_index_event() argument
246 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_index_event()
250 static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data, in mgmt_limited_event() argument
253 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_limited_event()
257 static int mgmt_generic_event(u16 event, struct hci_dev *hdev, void *data, in mgmt_generic_event() argument
260 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_generic_event()
264 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len, in mgmt_event() argument
267 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_event()
279 static int read_version(struct sock *sk, struct hci_dev *hdev, void *data, in read_version() argument
293 static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data, in read_commands() argument
345 static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data, in read_index_list() argument
405 static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev, in read_unconf_index_list() argument
465 static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev, in read_ext_index_list() argument
541 static bool is_configured(struct hci_dev *hdev) in is_configured() argument
543 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in is_configured()
544 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED)) in is_configured()
547 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) && in is_configured()
548 !bacmp(&hdev->public_addr, BDADDR_ANY)) in is_configured()
554 static __le32 get_missing_options(struct hci_dev *hdev) in get_missing_options() argument
558 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in get_missing_options()
559 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED)) in get_missing_options()
562 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) && in get_missing_options()
563 !bacmp(&hdev->public_addr, BDADDR_ANY)) in get_missing_options()
569 static int new_options(struct hci_dev *hdev, struct sock *skip) in new_options() argument
571 __le32 options = get_missing_options(hdev); in new_options()
573 return mgmt_generic_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options, in new_options()
577 static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) in send_options_rsp() argument
579 __le32 options = get_missing_options(hdev); in send_options_rsp()
581 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options, in send_options_rsp()
585 static int read_config_info(struct sock *sk, struct hci_dev *hdev, in read_config_info() argument
591 BT_DBG("sock %p %s", sk, hdev->name); in read_config_info()
593 hci_dev_lock(hdev); in read_config_info()
596 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_config_info()
598 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in read_config_info()
601 if (hdev->set_bdaddr) in read_config_info()
605 rp.missing_options = get_missing_options(hdev); in read_config_info()
607 hci_dev_unlock(hdev); in read_config_info()
609 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0, in read_config_info()
613 static u32 get_supported_settings(struct hci_dev *hdev) in get_supported_settings() argument
623 if (lmp_bredr_capable(hdev)) { in get_supported_settings()
624 if (hdev->hci_ver >= BLUETOOTH_VER_1_2) in get_supported_settings()
629 if (lmp_ssp_capable(hdev)) { in get_supported_settings()
634 if (lmp_sc_capable(hdev)) in get_supported_settings()
638 if (lmp_le_capable(hdev)) { in get_supported_settings()
646 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || in get_supported_settings()
647 hdev->set_bdaddr) in get_supported_settings()
653 static u32 get_current_settings(struct hci_dev *hdev) in get_current_settings() argument
657 if (hdev_is_powered(hdev)) in get_current_settings()
660 if (hci_dev_test_flag(hdev, HCI_CONNECTABLE)) in get_current_settings()
663 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) in get_current_settings()
666 if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) in get_current_settings()
669 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) in get_current_settings()
672 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in get_current_settings()
675 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in get_current_settings()
678 if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) in get_current_settings()
681 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in get_current_settings()
684 if (hci_dev_test_flag(hdev, HCI_HS_ENABLED)) in get_current_settings()
687 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in get_current_settings()
690 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) in get_current_settings()
693 if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) in get_current_settings()
696 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) in get_current_settings()
711 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || in get_current_settings()
712 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) || in get_current_settings()
713 !bacmp(&hdev->bdaddr, BDADDR_ANY)) { in get_current_settings()
714 if (bacmp(&hdev->static_addr, BDADDR_ANY)) in get_current_settings()
723 static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len) in create_uuid16_list() argument
731 list_for_each_entry(uuid, &hdev->uuids, list) { in create_uuid16_list()
765 static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len) in create_uuid32_list() argument
773 list_for_each_entry(uuid, &hdev->uuids, list) { in create_uuid32_list()
798 static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len) in create_uuid128_list() argument
806 list_for_each_entry(uuid, &hdev->uuids, list) { in create_uuid128_list()
831 static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev) in pending_find() argument
833 return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev); in pending_find()
837 struct hci_dev *hdev, in pending_find_data() argument
840 return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data); in pending_find_data()
843 static u8 get_current_adv_instance(struct hci_dev *hdev) in get_current_adv_instance() argument
850 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) && in get_current_adv_instance()
851 !hci_dev_test_flag(hdev, HCI_ADVERTISING)) in get_current_adv_instance()
852 return hdev->cur_adv_instance; in get_current_adv_instance()
857 static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) in create_default_scan_rsp_data() argument
862 name_len = strlen(hdev->dev_name); in create_default_scan_rsp_data()
874 memcpy(ptr + 2, hdev->dev_name, name_len); in create_default_scan_rsp_data()
883 static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance, in create_instance_scan_rsp_data() argument
888 adv_instance = hci_find_adv_instance(hdev, instance); in create_instance_scan_rsp_data()
903 struct hci_dev *hdev = req->hdev; in update_inst_scan_rsp_data() local
907 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in update_inst_scan_rsp_data()
913 len = create_instance_scan_rsp_data(hdev, instance, cp.data); in update_inst_scan_rsp_data()
915 len = create_default_scan_rsp_data(hdev, cp.data); in update_inst_scan_rsp_data()
917 if (hdev->scan_rsp_data_len == len && in update_inst_scan_rsp_data()
918 !memcmp(cp.data, hdev->scan_rsp_data, len)) in update_inst_scan_rsp_data()
921 memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data)); in update_inst_scan_rsp_data()
922 hdev->scan_rsp_data_len = len; in update_inst_scan_rsp_data()
931 update_inst_scan_rsp_data(req, get_current_adv_instance(req->hdev)); in update_scan_rsp_data()
934 static u8 get_adv_discov_flags(struct hci_dev *hdev) in get_adv_discov_flags() argument
941 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); in get_adv_discov_flags()
949 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) in get_adv_discov_flags()
951 else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) in get_adv_discov_flags()
958 static bool get_connectable(struct hci_dev *hdev) in get_connectable() argument
965 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); in get_connectable()
972 return hci_dev_test_flag(hdev, HCI_CONNECTABLE); in get_connectable()
975 static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance) in get_adv_instance_flags() argument
989 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) in get_adv_instance_flags()
995 adv_instance = hci_find_adv_instance(hdev, instance); in get_adv_instance_flags()
1004 static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev) in get_cur_adv_instance_scan_rsp_len() argument
1006 u8 instance = get_current_adv_instance(hdev); in get_cur_adv_instance_scan_rsp_len()
1013 adv_instance = hci_find_adv_instance(hdev, instance); in get_cur_adv_instance_scan_rsp_len()
1023 static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) in create_instance_adv_data() argument
1031 adv_instance = hci_find_adv_instance(hdev, instance); in create_instance_adv_data()
1036 instance_flags = get_adv_instance_flags(hdev, instance); in create_instance_adv_data()
1052 flags |= get_adv_discov_flags(hdev); in create_instance_adv_data()
1054 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in create_instance_adv_data()
1078 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID && in create_instance_adv_data()
1082 ptr[2] = (u8)hdev->adv_tx_power; in create_instance_adv_data()
1093 struct hci_dev *hdev = req->hdev; in update_inst_adv_data() local
1097 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in update_inst_adv_data()
1102 len = create_instance_adv_data(hdev, instance, cp.data); in update_inst_adv_data()
1105 if (hdev->adv_data_len == len && in update_inst_adv_data()
1106 memcmp(cp.data, hdev->adv_data, len) == 0) in update_inst_adv_data()
1109 memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); in update_inst_adv_data()
1110 hdev->adv_data_len = len; in update_inst_adv_data()
1119 update_inst_adv_data(req, get_current_adv_instance(req->hdev)); in update_adv_data()
1122 int mgmt_update_adv_data(struct hci_dev *hdev) in mgmt_update_adv_data() argument
1126 hci_req_init(&req, hdev); in mgmt_update_adv_data()
1132 static void create_eir(struct hci_dev *hdev, u8 *data) in create_eir() argument
1137 name_len = strlen(hdev->dev_name); in create_eir()
1150 memcpy(ptr + 2, hdev->dev_name, name_len); in create_eir()
1155 if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) { in create_eir()
1158 ptr[2] = (u8) hdev->inq_tx_power; in create_eir()
1163 if (hdev->devid_source > 0) { in create_eir()
1167 put_unaligned_le16(hdev->devid_source, ptr + 2); in create_eir()
1168 put_unaligned_le16(hdev->devid_vendor, ptr + 4); in create_eir()
1169 put_unaligned_le16(hdev->devid_product, ptr + 6); in create_eir()
1170 put_unaligned_le16(hdev->devid_version, ptr + 8); in create_eir()
1175 ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data)); in create_eir()
1176 ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data)); in create_eir()
1177 ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data)); in create_eir()
1182 struct hci_dev *hdev = req->hdev; in update_eir() local
1185 if (!hdev_is_powered(hdev)) in update_eir()
1188 if (!lmp_ext_inq_capable(hdev)) in update_eir()
1191 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in update_eir()
1194 if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE)) in update_eir()
1199 create_eir(hdev, cp.data); in update_eir()
1201 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0) in update_eir()
1204 memcpy(hdev->eir, cp.data, sizeof(cp.data)); in update_eir()
1209 static u8 get_service_classes(struct hci_dev *hdev) in get_service_classes() argument
1214 list_for_each_entry(uuid, &hdev->uuids, list) in get_service_classes()
1222 struct hci_dev *hdev = req->hdev; in update_class() local
1225 BT_DBG("%s", hdev->name); in update_class()
1227 if (!hdev_is_powered(hdev)) in update_class()
1230 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in update_class()
1233 if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE)) in update_class()
1236 cod[0] = hdev->minor_class; in update_class()
1237 cod[1] = hdev->major_class; in update_class()
1238 cod[2] = get_service_classes(hdev); in update_class()
1240 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) in update_class()
1243 if (memcmp(cod, hdev->dev_class, 3) == 0) in update_class()
1258 struct hci_dev *hdev = req->hdev; in enable_advertising() local
1265 if (hci_conn_num(hdev, LE_LINK) > 0) in enable_advertising()
1268 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in enable_advertising()
1276 hci_dev_clear_flag(hdev, HCI_LE_ADV); in enable_advertising()
1278 instance = get_current_adv_instance(hdev); in enable_advertising()
1279 flags = get_adv_instance_flags(hdev, instance); in enable_advertising()
1285 get_connectable(hdev); in enable_advertising()
1295 cp.min_interval = cpu_to_le16(hdev->le_adv_min_interval); in enable_advertising()
1296 cp.max_interval = cpu_to_le16(hdev->le_adv_max_interval); in enable_advertising()
1300 else if (get_cur_adv_instance_scan_rsp_len(hdev)) in enable_advertising()
1306 cp.channel_map = hdev->le_adv_channel_map; in enable_advertising()
1315 struct hci_dev *hdev = container_of(work, struct hci_dev, in service_cache_off() local
1319 if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) in service_cache_off()
1322 hci_req_init(&req, hdev); in service_cache_off()
1324 hci_dev_lock(hdev); in service_cache_off()
1329 hci_dev_unlock(hdev); in service_cache_off()
1336 struct hci_dev *hdev = container_of(work, struct hci_dev, in rpa_expired() local
1342 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); in rpa_expired()
1344 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING)) in rpa_expired()
1350 hci_req_init(&req, hdev); in rpa_expired()
1355 static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev) in mgmt_init_hdev() argument
1357 if (hci_dev_test_and_set_flag(hdev, HCI_MGMT)) in mgmt_init_hdev()
1360 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off); in mgmt_init_hdev()
1361 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired); in mgmt_init_hdev()
1368 hci_dev_clear_flag(hdev, HCI_BONDABLE); in mgmt_init_hdev()
1371 static int read_controller_info(struct sock *sk, struct hci_dev *hdev, in read_controller_info() argument
1376 BT_DBG("sock %p %s", sk, hdev->name); in read_controller_info()
1378 hci_dev_lock(hdev); in read_controller_info()
1382 bacpy(&rp.bdaddr, &hdev->bdaddr); in read_controller_info()
1384 rp.version = hdev->hci_ver; in read_controller_info()
1385 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_controller_info()
1387 rp.supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_controller_info()
1388 rp.current_settings = cpu_to_le32(get_current_settings(hdev)); in read_controller_info()
1390 memcpy(rp.dev_class, hdev->dev_class, 3); in read_controller_info()
1392 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); in read_controller_info()
1393 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name)); in read_controller_info()
1395 hci_dev_unlock(hdev); in read_controller_info()
1397 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp, in read_controller_info()
1401 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) in send_settings_rsp() argument
1403 __le32 settings = cpu_to_le32(get_current_settings(hdev)); in send_settings_rsp()
1405 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings, in send_settings_rsp()
1409 static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode) in clean_up_hci_complete() argument
1411 BT_DBG("%s status 0x%02x", hdev->name, status); in clean_up_hci_complete()
1413 if (hci_conn_count(hdev) == 0) { in clean_up_hci_complete()
1414 cancel_delayed_work(&hdev->power_off); in clean_up_hci_complete()
1415 queue_work(hdev->req_workqueue, &hdev->power_off.work); in clean_up_hci_complete()
1421 struct hci_dev *hdev = req->hdev; in hci_stop_discovery() local
1425 switch (hdev->discovery.state) { in hci_stop_discovery()
1427 if (test_bit(HCI_INQUIRY, &hdev->flags)) in hci_stop_discovery()
1430 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) { in hci_stop_discovery()
1431 cancel_delayed_work(&hdev->le_scan_disable); in hci_stop_discovery()
1438 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, in hci_stop_discovery()
1451 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) { in hci_stop_discovery()
1462 static void advertising_added(struct sock *sk, struct hci_dev *hdev, in advertising_added() argument
1469 mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk); in advertising_added()
1472 static void advertising_removed(struct sock *sk, struct hci_dev *hdev, in advertising_removed() argument
1479 mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk); in advertising_removed()
1484 struct hci_dev *hdev = req->hdev; in schedule_adv_instance() local
1488 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in schedule_adv_instance()
1489 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in schedule_adv_instance()
1492 if (hdev->adv_instance_timeout) in schedule_adv_instance()
1495 adv_instance = hci_find_adv_instance(hdev, instance); in schedule_adv_instance()
1520 hdev->adv_instance_timeout = timeout; in schedule_adv_instance()
1521 queue_delayed_work(hdev->workqueue, in schedule_adv_instance()
1522 &hdev->adv_instance_expire, in schedule_adv_instance()
1529 if (!force && hdev->cur_adv_instance == instance && in schedule_adv_instance()
1530 hci_dev_test_flag(hdev, HCI_LE_ADV)) in schedule_adv_instance()
1533 hdev->cur_adv_instance = instance; in schedule_adv_instance()
1541 static void cancel_adv_timeout(struct hci_dev *hdev) in cancel_adv_timeout() argument
1543 if (hdev->adv_instance_timeout) { in cancel_adv_timeout()
1544 hdev->adv_instance_timeout = 0; in cancel_adv_timeout()
1545 cancel_delayed_work(&hdev->adv_instance_expire); in cancel_adv_timeout()
1560 static void clear_adv_instance(struct hci_dev *hdev, struct hci_request *req, in clear_adv_instance() argument
1568 if (!instance || hdev->cur_adv_instance == instance) in clear_adv_instance()
1569 cancel_adv_timeout(hdev); in clear_adv_instance()
1575 if (instance && hdev->cur_adv_instance == instance) in clear_adv_instance()
1576 next_instance = hci_get_next_instance(hdev, instance); in clear_adv_instance()
1579 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, in clear_adv_instance()
1585 err = hci_remove_adv_instance(hdev, rem_inst); in clear_adv_instance()
1587 advertising_removed(NULL, hdev, rem_inst); in clear_adv_instance()
1589 hdev->cur_adv_instance = 0x00; in clear_adv_instance()
1591 adv_instance = hci_find_adv_instance(hdev, instance); in clear_adv_instance()
1600 err = hci_remove_adv_instance(hdev, instance); in clear_adv_instance()
1602 advertising_removed(NULL, hdev, instance); in clear_adv_instance()
1606 if (list_empty(&hdev->adv_instances)) { in clear_adv_instance()
1607 hdev->cur_adv_instance = 0x00; in clear_adv_instance()
1608 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE); in clear_adv_instance()
1611 if (!req || !hdev_is_powered(hdev) || in clear_adv_instance()
1612 hci_dev_test_flag(hdev, HCI_ADVERTISING)) in clear_adv_instance()
1619 static int clean_up_hci_state(struct hci_dev *hdev) in clean_up_hci_state() argument
1626 hci_req_init(&req, hdev); in clean_up_hci_state()
1628 if (test_bit(HCI_ISCAN, &hdev->flags) || in clean_up_hci_state()
1629 test_bit(HCI_PSCAN, &hdev->flags)) { in clean_up_hci_state()
1634 clear_adv_instance(hdev, NULL, 0x00, false); in clean_up_hci_state()
1636 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in clean_up_hci_state()
1641 list_for_each_entry(conn, &hdev->conn_hash.list, list) { in clean_up_hci_state()
1648 hci_discovery_set_state(hdev, DISCOVERY_STOPPING); in clean_up_hci_state()
1653 static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data, in set_powered() argument
1660 BT_DBG("request for %s", hdev->name); in set_powered()
1663 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1666 hci_dev_lock(hdev); in set_powered()
1668 if (pending_find(MGMT_OP_SET_POWERED, hdev)) { in set_powered()
1669 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1674 if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) { in set_powered()
1675 cancel_delayed_work(&hdev->power_off); in set_powered()
1678 mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, in set_powered()
1680 err = mgmt_powered(hdev, 1); in set_powered()
1685 if (!!cp->val == hdev_is_powered(hdev)) { in set_powered()
1686 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev); in set_powered()
1690 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len); in set_powered()
1697 queue_work(hdev->req_workqueue, &hdev->power_on); in set_powered()
1701 err = clean_up_hci_state(hdev); in set_powered()
1703 queue_delayed_work(hdev->req_workqueue, &hdev->power_off, in set_powered()
1708 cancel_delayed_work(&hdev->power_off); in set_powered()
1709 queue_work(hdev->req_workqueue, &hdev->power_off.work); in set_powered()
1715 hci_dev_unlock(hdev); in set_powered()
1719 static int new_settings(struct hci_dev *hdev, struct sock *skip) in new_settings() argument
1721 __le32 ev = cpu_to_le32(get_current_settings(hdev)); in new_settings()
1723 return mgmt_generic_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, in new_settings()
1727 int mgmt_new_settings(struct hci_dev *hdev) in mgmt_new_settings() argument
1729 return new_settings(hdev, NULL); in mgmt_new_settings()
1734 struct hci_dev *hdev; member
1742 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); in settings_rsp()
1788 static u8 mgmt_bredr_support(struct hci_dev *hdev) in mgmt_bredr_support() argument
1790 if (!lmp_bredr_capable(hdev)) in mgmt_bredr_support()
1792 else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in mgmt_bredr_support()
1798 static u8 mgmt_le_support(struct hci_dev *hdev) in mgmt_le_support() argument
1800 if (!lmp_le_capable(hdev)) in mgmt_le_support()
1802 else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in mgmt_le_support()
1808 static void set_discoverable_complete(struct hci_dev *hdev, u8 status, in set_discoverable_complete() argument
1818 hci_dev_lock(hdev); in set_discoverable_complete()
1820 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable_complete()
1827 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable_complete()
1833 changed = !hci_dev_test_and_set_flag(hdev, HCI_DISCOVERABLE); in set_discoverable_complete()
1835 if (hdev->discov_timeout > 0) { in set_discoverable_complete()
1836 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable_complete()
1837 queue_delayed_work(hdev->workqueue, &hdev->discov_off, in set_discoverable_complete()
1841 changed = hci_dev_test_and_clear_flag(hdev, HCI_DISCOVERABLE); in set_discoverable_complete()
1844 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable_complete()
1847 new_settings(hdev, cmd->sk); in set_discoverable_complete()
1854 hci_req_init(&req, hdev); in set_discoverable_complete()
1863 hci_dev_unlock(hdev); in set_discoverable_complete()
1866 static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data, in set_discoverable() argument
1876 BT_DBG("request for %s", hdev->name); in set_discoverable()
1878 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in set_discoverable()
1879 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_discoverable()
1880 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1884 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1894 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1897 hci_dev_lock(hdev); in set_discoverable()
1899 if (!hdev_is_powered(hdev) && timeout > 0) { in set_discoverable()
1900 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1905 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || in set_discoverable()
1906 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { in set_discoverable()
1907 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1912 if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) { in set_discoverable()
1913 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1918 if (!hdev_is_powered(hdev)) { in set_discoverable()
1925 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) { in set_discoverable()
1926 hci_dev_change_flag(hdev, HCI_DISCOVERABLE); in set_discoverable()
1930 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable()
1935 err = new_settings(hdev, sk); in set_discoverable()
1944 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_discoverable()
1945 (cp->val == 0x02) == hci_dev_test_flag(hdev, in set_discoverable()
1947 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1948 hdev->discov_timeout = timeout; in set_discoverable()
1950 if (cp->val && hdev->discov_timeout > 0) { in set_discoverable()
1951 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable()
1952 queue_delayed_work(hdev->workqueue, &hdev->discov_off, in set_discoverable()
1956 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable()
1960 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len); in set_discoverable()
1970 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1971 hdev->discov_timeout = timeout; in set_discoverable()
1975 hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1977 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1979 hci_req_init(&req, hdev); in set_discoverable()
1984 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_discoverable()
1994 hci_cp.num_iac = min_t(u8, hdev->num_iac, 2); in set_discoverable()
2014 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
2027 hci_dev_unlock(hdev); in set_discoverable()
2033 struct hci_dev *hdev = req->hdev; in write_fast_connectable() local
2037 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in write_fast_connectable()
2040 if (hdev->hci_ver < BLUETOOTH_VER_1_2) in write_fast_connectable()
2057 if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval || in write_fast_connectable()
2058 __cpu_to_le16(hdev->page_scan_window) != acp.window) in write_fast_connectable()
2062 if (hdev->page_scan_type != type) in write_fast_connectable()
2066 static void set_connectable_complete(struct hci_dev *hdev, u8 status, in set_connectable_complete() argument
2075 hci_dev_lock(hdev); in set_connectable_complete()
2077 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_complete()
2089 conn_changed = !hci_dev_test_and_set_flag(hdev, in set_connectable_complete()
2093 conn_changed = hci_dev_test_and_clear_flag(hdev, in set_connectable_complete()
2095 discov_changed = hci_dev_test_and_clear_flag(hdev, in set_connectable_complete()
2099 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_complete()
2102 new_settings(hdev, cmd->sk); in set_connectable_complete()
2103 hci_update_page_scan(hdev); in set_connectable_complete()
2105 mgmt_update_adv_data(hdev); in set_connectable_complete()
2106 hci_update_background_scan(hdev); in set_connectable_complete()
2113 hci_dev_unlock(hdev); in set_connectable_complete()
2116 static int set_connectable_update_settings(struct hci_dev *hdev, in set_connectable_update_settings() argument
2122 if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE)) in set_connectable_update_settings()
2126 hci_dev_set_flag(hdev, HCI_CONNECTABLE); in set_connectable_update_settings()
2128 hci_dev_clear_flag(hdev, HCI_CONNECTABLE); in set_connectable_update_settings()
2129 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_connectable_update_settings()
2132 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_update_settings()
2137 hci_update_page_scan(hdev); in set_connectable_update_settings()
2138 hci_update_background_scan(hdev); in set_connectable_update_settings()
2139 return new_settings(hdev, sk); in set_connectable_update_settings()
2145 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data, in set_connectable() argument
2154 BT_DBG("request for %s", hdev->name); in set_connectable()
2156 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in set_connectable()
2157 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_connectable()
2158 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
2162 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
2165 hci_dev_lock(hdev); in set_connectable()
2167 if (!hdev_is_powered(hdev)) { in set_connectable()
2168 err = set_connectable_update_settings(hdev, sk, cp->val); in set_connectable()
2172 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || in set_connectable()
2173 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { in set_connectable()
2174 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
2179 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len); in set_connectable()
2185 hci_req_init(&req, hdev); in set_connectable()
2191 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_connectable()
2193 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_connectable()
2194 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_connectable()
2197 } else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) { in set_connectable()
2207 if (list_empty(&hdev->whitelist)) in set_connectable()
2209 else if (test_bit(HCI_ISCAN, &hdev->flags)) in set_connectable()
2214 if (test_bit(HCI_ISCAN, &hdev->flags) && in set_connectable()
2215 hdev->discov_timeout > 0) in set_connectable()
2216 cancel_delayed_work(&hdev->discov_off); in set_connectable()
2224 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in set_connectable()
2225 hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in set_connectable()
2232 err = set_connectable_update_settings(hdev, sk, in set_connectable()
2238 hci_dev_unlock(hdev); in set_connectable()
2242 static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data, in set_bondable() argument
2249 BT_DBG("request for %s", hdev->name); in set_bondable()
2252 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE, in set_bondable()
2255 hci_dev_lock(hdev); in set_bondable()
2258 changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE); in set_bondable()
2260 changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE); in set_bondable()
2262 err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev); in set_bondable()
2267 err = new_settings(hdev, sk); in set_bondable()
2270 hci_dev_unlock(hdev); in set_bondable()
2274 static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data, in set_link_security() argument
2282 BT_DBG("request for %s", hdev->name); in set_link_security()
2284 status = mgmt_bredr_support(hdev); in set_link_security()
2286 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
2290 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
2293 hci_dev_lock(hdev); in set_link_security()
2295 if (!hdev_is_powered(hdev)) { in set_link_security()
2298 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { in set_link_security()
2299 hci_dev_change_flag(hdev, HCI_LINK_SECURITY); in set_link_security()
2303 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev); in set_link_security()
2308 err = new_settings(hdev, sk); in set_link_security()
2313 if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) { in set_link_security()
2314 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
2321 if (test_bit(HCI_AUTH, &hdev->flags) == val) { in set_link_security()
2322 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev); in set_link_security()
2326 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len); in set_link_security()
2332 err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val); in set_link_security()
2339 hci_dev_unlock(hdev); in set_link_security()
2343 static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_ssp() argument
2350 BT_DBG("request for %s", hdev->name); in set_ssp()
2352 status = mgmt_bredr_support(hdev); in set_ssp()
2354 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status); in set_ssp()
2356 if (!lmp_ssp_capable(hdev)) in set_ssp()
2357 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2361 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2364 hci_dev_lock(hdev); in set_ssp()
2366 if (!hdev_is_powered(hdev)) { in set_ssp()
2370 changed = !hci_dev_test_and_set_flag(hdev, in set_ssp()
2373 changed = hci_dev_test_and_clear_flag(hdev, in set_ssp()
2376 changed = hci_dev_test_and_clear_flag(hdev, in set_ssp()
2379 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in set_ssp()
2382 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev); in set_ssp()
2387 err = new_settings(hdev, sk); in set_ssp()
2392 if (pending_find(MGMT_OP_SET_SSP, hdev)) { in set_ssp()
2393 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2398 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_ssp()
2399 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev); in set_ssp()
2403 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len); in set_ssp()
2409 if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in set_ssp()
2410 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, in set_ssp()
2413 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val); in set_ssp()
2420 hci_dev_unlock(hdev); in set_ssp()
2424 static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_hs() argument
2431 BT_DBG("request for %s", hdev->name); in set_hs()
2433 status = mgmt_bredr_support(hdev); in set_hs()
2435 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status); in set_hs()
2437 if (!lmp_ssp_capable(hdev)) in set_hs()
2438 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2441 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in set_hs()
2442 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2446 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2449 hci_dev_lock(hdev); in set_hs()
2451 if (pending_find(MGMT_OP_SET_SSP, hdev)) { in set_hs()
2452 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2458 changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED); in set_hs()
2460 if (hdev_is_powered(hdev)) { in set_hs()
2461 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2466 changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED); in set_hs()
2469 err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev); in set_hs()
2474 err = new_settings(hdev, sk); in set_hs()
2477 hci_dev_unlock(hdev); in set_hs()
2481 static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in le_enable_complete() argument
2483 struct cmd_lookup match = { NULL, hdev }; in le_enable_complete()
2485 hci_dev_lock(hdev); in le_enable_complete()
2490 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp, in le_enable_complete()
2495 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match); in le_enable_complete()
2497 new_settings(hdev, match.sk); in le_enable_complete()
2507 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in le_enable_complete()
2510 hci_req_init(&req, hdev); in le_enable_complete()
2518 hci_dev_unlock(hdev); in le_enable_complete()
2521 static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_le() argument
2530 BT_DBG("request for %s", hdev->name); in set_le()
2532 if (!lmp_le_capable(hdev)) in set_le()
2533 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2537 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2549 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_le()
2551 return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev); in set_le()
2553 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2557 hci_dev_lock(hdev); in set_le()
2560 enabled = lmp_host_le_capable(hdev); in set_le()
2563 clear_adv_instance(hdev, NULL, 0x00, true); in set_le()
2565 if (!hdev_is_powered(hdev) || val == enabled) { in set_le()
2568 if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in set_le()
2569 hci_dev_change_flag(hdev, HCI_LE_ENABLED); in set_le()
2573 if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in set_le()
2574 hci_dev_clear_flag(hdev, HCI_ADVERTISING); in set_le()
2578 err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev); in set_le()
2583 err = new_settings(hdev, sk); in set_le()
2588 if (pending_find(MGMT_OP_SET_LE, hdev) || in set_le()
2589 pending_find(MGMT_OP_SET_ADVERTISING, hdev)) { in set_le()
2590 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2595 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len); in set_le()
2601 hci_req_init(&req, hdev); in set_le()
2609 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_le()
2621 hci_dev_unlock(hdev); in set_le()
2631 static bool pending_eir_or_class(struct hci_dev *hdev) in pending_eir_or_class() argument
2635 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in pending_eir_or_class()
2667 static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status) in mgmt_class_complete() argument
2671 hci_dev_lock(hdev); in mgmt_class_complete()
2673 cmd = pending_find(mgmt_op, hdev); in mgmt_class_complete()
2678 mgmt_status(status), hdev->dev_class, 3); in mgmt_class_complete()
2683 hci_dev_unlock(hdev); in mgmt_class_complete()
2686 static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode) in add_uuid_complete() argument
2690 mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status); in add_uuid_complete()
2693 static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in add_uuid() argument
2701 BT_DBG("request for %s", hdev->name); in add_uuid()
2703 hci_dev_lock(hdev); in add_uuid()
2705 if (pending_eir_or_class(hdev)) { in add_uuid()
2706 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID, in add_uuid()
2721 list_add_tail(&uuid->list, &hdev->uuids); in add_uuid()
2723 hci_req_init(&req, hdev); in add_uuid()
2733 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0, in add_uuid()
2734 hdev->dev_class, 3); in add_uuid()
2738 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len); in add_uuid()
2747 hci_dev_unlock(hdev); in add_uuid()
2751 static bool enable_service_cache(struct hci_dev *hdev) in enable_service_cache() argument
2753 if (!hdev_is_powered(hdev)) in enable_service_cache()
2756 if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) { in enable_service_cache()
2757 queue_delayed_work(hdev->workqueue, &hdev->service_cache, in enable_service_cache()
2765 static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode) in remove_uuid_complete() argument
2769 mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status); in remove_uuid_complete()
2772 static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data, in remove_uuid() argument
2782 BT_DBG("request for %s", hdev->name); in remove_uuid()
2784 hci_dev_lock(hdev); in remove_uuid()
2786 if (pending_eir_or_class(hdev)) { in remove_uuid()
2787 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2793 hci_uuids_clear(hdev); in remove_uuid()
2795 if (enable_service_cache(hdev)) { in remove_uuid()
2796 err = mgmt_cmd_complete(sk, hdev->id, in remove_uuid()
2798 0, hdev->dev_class, 3); in remove_uuid()
2807 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) { in remove_uuid()
2817 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2823 hci_req_init(&req, hdev); in remove_uuid()
2833 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0, in remove_uuid()
2834 hdev->dev_class, 3); in remove_uuid()
2838 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len); in remove_uuid()
2847 hci_dev_unlock(hdev); in remove_uuid()
2851 static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_class_complete() argument
2855 mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status); in set_class_complete()
2858 static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data, in set_dev_class() argument
2866 BT_DBG("request for %s", hdev->name); in set_dev_class()
2868 if (!lmp_bredr_capable(hdev)) in set_dev_class()
2869 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2872 hci_dev_lock(hdev); in set_dev_class()
2874 if (pending_eir_or_class(hdev)) { in set_dev_class()
2875 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2881 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2886 hdev->major_class = cp->major; in set_dev_class()
2887 hdev->minor_class = cp->minor; in set_dev_class()
2889 if (!hdev_is_powered(hdev)) { in set_dev_class()
2890 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2891 hdev->dev_class, 3); in set_dev_class()
2895 hci_req_init(&req, hdev); in set_dev_class()
2897 if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) { in set_dev_class()
2898 hci_dev_unlock(hdev); in set_dev_class()
2899 cancel_delayed_work_sync(&hdev->service_cache); in set_dev_class()
2900 hci_dev_lock(hdev); in set_dev_class()
2911 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2912 hdev->dev_class, 3); in set_dev_class()
2916 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len); in set_dev_class()
2925 hci_dev_unlock(hdev); in set_dev_class()
2929 static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data, in load_link_keys() argument
2939 BT_DBG("request for %s", hdev->name); in load_link_keys()
2941 if (!lmp_bredr_capable(hdev)) in load_link_keys()
2942 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2949 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2958 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2963 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2966 BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys, in load_link_keys()
2973 return mgmt_cmd_status(sk, hdev->id, in load_link_keys()
2978 hci_dev_lock(hdev); in load_link_keys()
2980 hci_link_keys_clear(hdev); in load_link_keys()
2983 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS); in load_link_keys()
2985 changed = hci_dev_test_and_clear_flag(hdev, in load_link_keys()
2989 new_settings(hdev, NULL); in load_link_keys()
3000 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val, in load_link_keys()
3004 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0); in load_link_keys()
3006 hci_dev_unlock(hdev); in load_link_keys()
3011 static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr, in device_unpaired() argument
3019 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev), in device_unpaired()
3023 static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data, in unpair_device() argument
3039 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
3044 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
3048 hci_dev_lock(hdev); in unpair_device()
3050 if (!hdev_is_powered(hdev)) { in unpair_device()
3051 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
3066 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in unpair_device()
3071 err = hci_remove_link_key(hdev, &cp->addr.bdaddr); in unpair_device()
3073 err = mgmt_cmd_complete(sk, hdev->id, in unpair_device()
3086 hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3088 err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3090 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
3096 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3098 hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3111 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3130 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0, in unpair_device()
3132 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk); in unpair_device()
3136 cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp, in unpair_device()
3150 hci_dev_unlock(hdev); in unpair_device()
3154 static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data, in disconnect() argument
3170 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3174 hci_dev_lock(hdev); in disconnect()
3176 if (!test_bit(HCI_UP, &hdev->flags)) { in disconnect()
3177 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3183 if (pending_find(MGMT_OP_DISCONNECT, hdev)) { in disconnect()
3184 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3190 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in disconnect()
3193 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, in disconnect()
3197 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3203 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len); in disconnect()
3216 hci_dev_unlock(hdev); in disconnect()
3239 static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, in get_connections() argument
3250 hci_dev_lock(hdev); in get_connections()
3252 if (!hdev_is_powered(hdev)) { in get_connections()
3253 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, in get_connections()
3259 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
3272 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
3287 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp, in get_connections()
3293 hci_dev_unlock(hdev); in get_connections()
3297 static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, in send_pin_code_neg_reply() argument
3303 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp, in send_pin_code_neg_reply()
3308 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, in send_pin_code_neg_reply()
3316 static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data, in pin_code_reply() argument
3327 hci_dev_lock(hdev); in pin_code_reply()
3329 if (!hdev_is_powered(hdev)) { in pin_code_reply()
3330 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3335 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in pin_code_reply()
3337 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3349 err = send_pin_code_neg_reply(sk, hdev, &ncp); in pin_code_reply()
3351 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3357 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len); in pin_code_reply()
3369 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply); in pin_code_reply()
3374 hci_dev_unlock(hdev); in pin_code_reply()
3378 static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data, in set_io_capability() argument
3386 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, in set_io_capability()
3389 hci_dev_lock(hdev); in set_io_capability()
3391 hdev->io_capability = cp->io_capability; in set_io_capability()
3393 BT_DBG("%s IO capability set to 0x%02x", hdev->name, in set_io_capability()
3394 hdev->io_capability); in set_io_capability()
3396 hci_dev_unlock(hdev); in set_io_capability()
3398 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, in set_io_capability()
3404 struct hci_dev *hdev = conn->hdev; in find_pairing() local
3407 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in find_pairing()
3496 static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data, in pair_device() argument
3513 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3518 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3522 hci_dev_lock(hdev); in pair_device()
3524 if (!hdev_is_powered(hdev)) { in pair_device()
3525 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3531 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) { in pair_device()
3532 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3542 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level, in pair_device()
3557 p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type); in pair_device()
3562 conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, in pair_device()
3580 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3587 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3592 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len); in pair_device()
3624 hci_dev_unlock(hdev); in pair_device()
3628 static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data, in cancel_pair_device() argument
3638 hci_dev_lock(hdev); in cancel_pair_device()
3640 if (!hdev_is_powered(hdev)) { in cancel_pair_device()
3641 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3646 cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev); in cancel_pair_device()
3648 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3656 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3664 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0, in cancel_pair_device()
3667 hci_dev_unlock(hdev); in cancel_pair_device()
3671 static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev, in user_pairing_resp() argument
3679 hci_dev_lock(hdev); in user_pairing_resp()
3681 if (!hdev_is_powered(hdev)) { in user_pairing_resp()
3682 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3689 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr); in user_pairing_resp()
3691 conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr, in user_pairing_resp()
3695 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3704 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3708 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3715 cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr)); in user_pairing_resp()
3729 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp); in user_pairing_resp()
3731 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr), in user_pairing_resp()
3738 hci_dev_unlock(hdev); in user_pairing_resp()
3742 static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, in pin_code_neg_reply() argument
3749 return user_pairing_resp(sk, hdev, &cp->addr, in pin_code_neg_reply()
3754 static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data, in user_confirm_reply() argument
3762 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY, in user_confirm_reply()
3765 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_reply()
3770 static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev, in user_confirm_neg_reply() argument
3777 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_neg_reply()
3782 static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data, in user_passkey_reply() argument
3789 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_reply()
3794 static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev, in user_passkey_neg_reply() argument
3801 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_neg_reply()
3808 struct hci_dev *hdev = req->hdev; in update_name() local
3811 memcpy(cp.name, hdev->dev_name, sizeof(cp.name)); in update_name()
3816 static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_name_complete() argument
3823 hci_dev_lock(hdev); in set_name_complete()
3825 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); in set_name_complete()
3832 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_name_complete()
3835 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_name_complete()
3841 hci_dev_unlock(hdev); in set_name_complete()
3844 static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data, in set_local_name() argument
3854 hci_dev_lock(hdev); in set_local_name()
3859 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) && in set_local_name()
3860 !memcmp(hdev->short_name, cp->short_name, in set_local_name()
3861 sizeof(hdev->short_name))) { in set_local_name()
3862 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3867 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name)); in set_local_name()
3869 if (!hdev_is_powered(hdev)) { in set_local_name()
3870 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3872 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3877 err = mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, in set_local_name()
3883 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len); in set_local_name()
3889 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3891 hci_req_init(&req, hdev); in set_local_name()
3893 if (lmp_bredr_capable(hdev)) { in set_local_name()
3901 if (lmp_le_capable(hdev)) in set_local_name()
3909 hci_dev_unlock(hdev); in set_local_name()
3913 static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status, in read_local_oob_data_complete() argument
3920 BT_DBG("%s status %u", hdev->name, status); in read_local_oob_data_complete()
3922 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev); in read_local_oob_data_complete()
3927 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
3938 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
3952 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
3965 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
3972 static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev, in read_local_oob_data() argument
3979 BT_DBG("%s", hdev->name); in read_local_oob_data()
3981 hci_dev_lock(hdev); in read_local_oob_data()
3983 if (!hdev_is_powered(hdev)) { in read_local_oob_data()
3984 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3989 if (!lmp_ssp_capable(hdev)) { in read_local_oob_data()
3990 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3995 if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) { in read_local_oob_data()
3996 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4001 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0); in read_local_oob_data()
4007 hci_req_init(&req, hdev); in read_local_oob_data()
4009 if (bredr_sc_enabled(hdev)) in read_local_oob_data()
4019 hci_dev_unlock(hdev); in read_local_oob_data()
4023 static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev, in add_remote_oob_data() argument
4029 BT_DBG("%s ", hdev->name); in add_remote_oob_data()
4032 return mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4037 hci_dev_lock(hdev); in add_remote_oob_data()
4044 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4051 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
4059 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4073 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4108 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
4116 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4121 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, in add_remote_oob_data()
4126 hci_dev_unlock(hdev); in add_remote_oob_data()
4130 static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev, in remove_remote_oob_data() argument
4137 BT_DBG("%s", hdev->name); in remove_remote_oob_data()
4140 return mgmt_cmd_complete(sk, hdev->id, in remove_remote_oob_data()
4145 hci_dev_lock(hdev); in remove_remote_oob_data()
4148 hci_remote_oob_data_clear(hdev); in remove_remote_oob_data()
4153 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type); in remove_remote_oob_data()
4160 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA, in remove_remote_oob_data()
4163 hci_dev_unlock(hdev); in remove_remote_oob_data()
4169 struct hci_dev *hdev = req->hdev; in trigger_bredr_inquiry() local
4174 *status = mgmt_bredr_support(hdev); in trigger_bredr_inquiry()
4178 if (hci_dev_test_flag(hdev, HCI_INQUIRY)) { in trigger_bredr_inquiry()
4183 hci_inquiry_cache_flush(hdev); in trigger_bredr_inquiry()
4196 struct hci_dev *hdev = req->hdev; in trigger_le_scan() local
4202 *status = mgmt_le_support(hdev); in trigger_le_scan()
4206 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) { in trigger_le_scan()
4210 if (hci_lookup_le_connect(hdev)) { in trigger_le_scan()
4215 cancel_adv_timeout(hdev); in trigger_le_scan()
4223 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) in trigger_le_scan()
4257 struct hci_dev *hdev = req->hdev; in trigger_discovery() local
4259 switch (hdev->discovery.type) { in trigger_discovery()
4267 &hdev->quirks)) { in trigger_discovery()
4282 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in trigger_discovery()
4301 static void start_discovery_complete(struct hci_dev *hdev, u8 status, in start_discovery_complete() argument
4309 hci_dev_lock(hdev); in start_discovery_complete()
4311 cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev); in start_discovery_complete()
4313 cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev); in start_discovery_complete()
4321 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); in start_discovery_complete()
4325 hci_discovery_set_state(hdev, DISCOVERY_FINDING); in start_discovery_complete()
4330 switch (hdev->discovery.type) { in start_discovery_complete()
4343 if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks)) in start_discovery_complete()
4346 timeout = msecs_to_jiffies(hdev->discov_interleaved_timeout); in start_discovery_complete()
4352 BT_ERR("Invalid discovery type %d", hdev->discovery.type); in start_discovery_complete()
4364 &hdev->quirks) && in start_discovery_complete()
4365 hdev->discovery.result_filtering) { in start_discovery_complete()
4366 hdev->discovery.scan_start = jiffies; in start_discovery_complete()
4367 hdev->discovery.scan_duration = timeout; in start_discovery_complete()
4370 queue_delayed_work(hdev->workqueue, in start_discovery_complete()
4371 &hdev->le_scan_disable, timeout); in start_discovery_complete()
4375 hci_dev_unlock(hdev); in start_discovery_complete()
4378 static int start_discovery(struct sock *sk, struct hci_dev *hdev, in start_discovery() argument
4387 BT_DBG("%s", hdev->name); in start_discovery()
4389 hci_dev_lock(hdev); in start_discovery()
4391 if (!hdev_is_powered(hdev)) { in start_discovery()
4392 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY, in start_discovery()
4398 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_discovery()
4399 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) { in start_discovery()
4400 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY, in start_discovery()
4406 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, data, len); in start_discovery()
4417 hci_discovery_filter_clear(hdev); in start_discovery()
4419 hdev->discovery.type = cp->type; in start_discovery()
4420 hdev->discovery.report_invalid_rssi = false; in start_discovery()
4422 hci_req_init(&req, hdev); in start_discovery()
4425 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY, in start_discovery()
4437 hci_discovery_set_state(hdev, DISCOVERY_STARTING); in start_discovery()
4440 hci_dev_unlock(hdev); in start_discovery()
4451 static int start_service_discovery(struct sock *sk, struct hci_dev *hdev, in start_service_discovery() argument
4462 BT_DBG("%s", hdev->name); in start_service_discovery()
4464 hci_dev_lock(hdev); in start_service_discovery()
4466 if (!hdev_is_powered(hdev)) { in start_service_discovery()
4467 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4474 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_service_discovery()
4475 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) { in start_service_discovery()
4476 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4487 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4498 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4506 hdev, data, len); in start_service_discovery()
4517 hci_discovery_filter_clear(hdev); in start_service_discovery()
4519 hdev->discovery.result_filtering = true; in start_service_discovery()
4520 hdev->discovery.type = cp->type; in start_service_discovery()
4521 hdev->discovery.rssi = cp->rssi; in start_service_discovery()
4522 hdev->discovery.uuid_count = uuid_count; in start_service_discovery()
4525 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16, in start_service_discovery()
4527 if (!hdev->discovery.uuids) { in start_service_discovery()
4528 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4537 hci_req_init(&req, hdev); in start_service_discovery()
4540 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4553 hci_discovery_set_state(hdev, DISCOVERY_STARTING); in start_service_discovery()
4556 hci_dev_unlock(hdev); in start_service_discovery()
4560 static void stop_discovery_complete(struct hci_dev *hdev, u8 status, u16 opcode) in stop_discovery_complete() argument
4566 hci_dev_lock(hdev); in stop_discovery_complete()
4568 cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev); in stop_discovery_complete()
4575 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); in stop_discovery_complete()
4577 hci_dev_unlock(hdev); in stop_discovery_complete()
4580 static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data, in stop_discovery() argument
4588 BT_DBG("%s", hdev->name); in stop_discovery()
4590 hci_dev_lock(hdev); in stop_discovery()
4592 if (!hci_discovery_active(hdev)) { in stop_discovery()
4593 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
4599 if (hdev->discovery.type != mgmt_cp->type) { in stop_discovery()
4600 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
4606 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len); in stop_discovery()
4614 hci_req_init(&req, hdev); in stop_discovery()
4620 hci_discovery_set_state(hdev, DISCOVERY_STOPPING); in stop_discovery()
4628 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0, in stop_discovery()
4630 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); in stop_discovery()
4634 hci_dev_unlock(hdev); in stop_discovery()
4638 static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data, in confirm_name() argument
4645 BT_DBG("%s", hdev->name); in confirm_name()
4647 hci_dev_lock(hdev); in confirm_name()
4649 if (!hci_discovery_active(hdev)) { in confirm_name()
4650 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
4656 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr); in confirm_name()
4658 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
4669 hci_inquiry_cache_update_resolve(hdev, e); in confirm_name()
4672 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, in confirm_name()
4676 hci_dev_unlock(hdev); in confirm_name()
4680 static int block_device(struct sock *sk, struct hci_dev *hdev, void *data, in block_device() argument
4687 BT_DBG("%s", hdev->name); in block_device()
4690 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, in block_device()
4694 hci_dev_lock(hdev); in block_device()
4696 err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr, in block_device()
4703 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr), in block_device()
4708 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status, in block_device()
4711 hci_dev_unlock(hdev); in block_device()
4716 static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data, in unblock_device() argument
4723 BT_DBG("%s", hdev->name); in unblock_device()
4726 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, in unblock_device()
4730 hci_dev_lock(hdev); in unblock_device()
4732 err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr, in unblock_device()
4739 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr), in unblock_device()
4744 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status, in unblock_device()
4747 hci_dev_unlock(hdev); in unblock_device()
4752 static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data, in set_device_id() argument
4760 BT_DBG("%s", hdev->name); in set_device_id()
4765 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, in set_device_id()
4768 hci_dev_lock(hdev); in set_device_id()
4770 hdev->devid_source = source; in set_device_id()
4771 hdev->devid_vendor = __le16_to_cpu(cp->vendor); in set_device_id()
4772 hdev->devid_product = __le16_to_cpu(cp->product); in set_device_id()
4773 hdev->devid_version = __le16_to_cpu(cp->version); in set_device_id()
4775 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, in set_device_id()
4778 hci_req_init(&req, hdev); in set_device_id()
4782 hci_dev_unlock(hdev); in set_device_id()
4787 static void enable_advertising_instance(struct hci_dev *hdev, u8 status, in enable_advertising_instance() argument
4793 static void set_advertising_complete(struct hci_dev *hdev, u8 status, in set_advertising_complete() argument
4796 struct cmd_lookup match = { NULL, hdev }; in set_advertising_complete()
4802 hci_dev_lock(hdev); in set_advertising_complete()
4807 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, in set_advertising_complete()
4812 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_advertising_complete()
4813 hci_dev_set_flag(hdev, HCI_ADVERTISING); in set_advertising_complete()
4815 hci_dev_clear_flag(hdev, HCI_ADVERTISING); in set_advertising_complete()
4817 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp, in set_advertising_complete()
4820 new_settings(hdev, match.sk); in set_advertising_complete()
4828 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in set_advertising_complete()
4829 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) || in set_advertising_complete()
4830 list_empty(&hdev->adv_instances)) in set_advertising_complete()
4833 instance = hdev->cur_adv_instance; in set_advertising_complete()
4835 adv_instance = list_first_entry_or_null(&hdev->adv_instances, in set_advertising_complete()
4843 hci_req_init(&req, hdev); in set_advertising_complete()
4854 hci_dev_unlock(hdev); in set_advertising_complete()
4857 static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data, in set_advertising() argument
4866 BT_DBG("request for %s", hdev->name); in set_advertising()
4868 status = mgmt_le_support(hdev); in set_advertising()
4870 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4874 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4877 hci_dev_lock(hdev); in set_advertising()
4886 if (!hdev_is_powered(hdev) || in set_advertising()
4887 (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) && in set_advertising()
4888 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) || in set_advertising()
4889 hci_conn_num(hdev, LE_LINK) > 0 || in set_advertising()
4890 (hci_dev_test_flag(hdev, HCI_LE_SCAN) && in set_advertising()
4891 hdev->le_scan_type == LE_SCAN_ACTIVE)) { in set_advertising()
4895 changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING); in set_advertising()
4897 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4899 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4901 changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING); in set_advertising()
4902 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4905 err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev); in set_advertising()
4910 err = new_settings(hdev, sk); in set_advertising()
4915 if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) || in set_advertising()
4916 pending_find(MGMT_OP_SET_LE, hdev)) { in set_advertising()
4917 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4922 cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len); in set_advertising()
4928 hci_req_init(&req, hdev); in set_advertising()
4931 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4933 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4935 cancel_adv_timeout(hdev); in set_advertising()
4954 hci_dev_unlock(hdev); in set_advertising()
4958 static int set_static_address(struct sock *sk, struct hci_dev *hdev, in set_static_address() argument
4964 BT_DBG("%s", hdev->name); in set_static_address()
4966 if (!lmp_le_capable(hdev)) in set_static_address()
4967 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
4970 if (hdev_is_powered(hdev)) in set_static_address()
4971 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
4976 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
4982 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
4987 hci_dev_lock(hdev); in set_static_address()
4989 bacpy(&hdev->static_addr, &cp->bdaddr); in set_static_address()
4991 err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev); in set_static_address()
4995 err = new_settings(hdev, sk); in set_static_address()
4998 hci_dev_unlock(hdev); in set_static_address()
5002 static int set_scan_params(struct sock *sk, struct hci_dev *hdev, in set_scan_params() argument
5009 BT_DBG("%s", hdev->name); in set_scan_params()
5011 if (!lmp_le_capable(hdev)) in set_scan_params()
5012 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5018 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5024 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5028 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5031 hci_dev_lock(hdev); in set_scan_params()
5033 hdev->le_scan_interval = interval; in set_scan_params()
5034 hdev->le_scan_window = window; in set_scan_params()
5036 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, in set_scan_params()
5042 if (hci_dev_test_flag(hdev, HCI_LE_SCAN) && in set_scan_params()
5043 hdev->discovery.state == DISCOVERY_STOPPED) { in set_scan_params()
5046 hci_req_init(&req, hdev); in set_scan_params()
5054 hci_dev_unlock(hdev); in set_scan_params()
5059 static void fast_connectable_complete(struct hci_dev *hdev, u8 status, in fast_connectable_complete() argument
5066 hci_dev_lock(hdev); in fast_connectable_complete()
5068 cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
5073 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in fast_connectable_complete()
5079 hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE); in fast_connectable_complete()
5081 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE); in fast_connectable_complete()
5083 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
5084 new_settings(hdev, cmd->sk); in fast_connectable_complete()
5090 hci_dev_unlock(hdev); in fast_connectable_complete()
5093 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, in set_fast_connectable() argument
5101 BT_DBG("%s", hdev->name); in set_fast_connectable()
5103 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) || in set_fast_connectable()
5104 hdev->hci_ver < BLUETOOTH_VER_1_2) in set_fast_connectable()
5105 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5109 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5112 hci_dev_lock(hdev); in set_fast_connectable()
5114 if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) { in set_fast_connectable()
5115 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5120 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) { in set_fast_connectable()
5122 hdev); in set_fast_connectable()
5126 if (!hdev_is_powered(hdev)) { in set_fast_connectable()
5127 hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE); in set_fast_connectable()
5129 hdev); in set_fast_connectable()
5130 new_settings(hdev, sk); in set_fast_connectable()
5134 cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev, in set_fast_connectable()
5141 hci_req_init(&req, hdev); in set_fast_connectable()
5147 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5153 hci_dev_unlock(hdev); in set_fast_connectable()
5158 static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_bredr_complete() argument
5164 hci_dev_lock(hdev); in set_bredr_complete()
5166 cmd = pending_find(MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
5176 hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); in set_bredr_complete()
5180 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
5181 new_settings(hdev, cmd->sk); in set_bredr_complete()
5187 hci_dev_unlock(hdev); in set_bredr_complete()
5190 static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_bredr() argument
5197 BT_DBG("request for %s", hdev->name); in set_bredr()
5199 if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev)) in set_bredr()
5200 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5203 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in set_bredr()
5204 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5208 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5211 hci_dev_lock(hdev); in set_bredr()
5213 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_bredr()
5214 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev); in set_bredr()
5218 if (!hdev_is_powered(hdev)) { in set_bredr()
5220 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_bredr()
5221 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED); in set_bredr()
5222 hci_dev_clear_flag(hdev, HCI_LINK_SECURITY); in set_bredr()
5223 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE); in set_bredr()
5224 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in set_bredr()
5227 hci_dev_change_flag(hdev, HCI_BREDR_ENABLED); in set_bredr()
5229 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev); in set_bredr()
5233 err = new_settings(hdev, sk); in set_bredr()
5239 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5257 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in set_bredr()
5258 (bacmp(&hdev->static_addr, BDADDR_ANY) || in set_bredr()
5259 hci_dev_test_flag(hdev, HCI_SC_ENABLED))) { in set_bredr()
5260 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5266 if (pending_find(MGMT_OP_SET_BREDR, hdev)) { in set_bredr()
5267 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5272 cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len); in set_bredr()
5281 hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); in set_bredr()
5283 hci_req_init(&req, hdev); in set_bredr()
5298 hci_dev_unlock(hdev); in set_bredr()
5302 static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in sc_enable_complete() argument
5307 BT_DBG("%s status %u", hdev->name, status); in sc_enable_complete()
5309 hci_dev_lock(hdev); in sc_enable_complete()
5311 cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
5325 hci_dev_clear_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
5326 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
5329 hci_dev_set_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
5330 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
5333 hci_dev_set_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
5334 hci_dev_set_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
5338 send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
5339 new_settings(hdev, cmd->sk); in sc_enable_complete()
5344 hci_dev_unlock(hdev); in sc_enable_complete()
5347 static int set_secure_conn(struct sock *sk, struct hci_dev *hdev, in set_secure_conn() argument
5356 BT_DBG("request for %s", hdev->name); in set_secure_conn()
5358 if (!lmp_sc_capable(hdev) && in set_secure_conn()
5359 !hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in set_secure_conn()
5360 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5363 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in set_secure_conn()
5364 lmp_sc_capable(hdev) && in set_secure_conn()
5365 !hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in set_secure_conn()
5366 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5370 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5373 hci_dev_lock(hdev); in set_secure_conn()
5375 if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) || in set_secure_conn()
5376 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_secure_conn()
5380 changed = !hci_dev_test_and_set_flag(hdev, in set_secure_conn()
5383 hci_dev_set_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
5385 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
5387 changed = hci_dev_test_and_clear_flag(hdev, in set_secure_conn()
5389 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
5392 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev); in set_secure_conn()
5397 err = new_settings(hdev, sk); in set_secure_conn()
5402 if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) { in set_secure_conn()
5403 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5410 if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) && in set_secure_conn()
5411 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in set_secure_conn()
5412 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev); in set_secure_conn()
5416 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SECURE_CONN, hdev, data, len); in set_secure_conn()
5422 hci_req_init(&req, hdev); in set_secure_conn()
5431 hci_dev_unlock(hdev); in set_secure_conn()
5435 static int set_debug_keys(struct sock *sk, struct hci_dev *hdev, in set_debug_keys() argument
5442 BT_DBG("request for %s", hdev->name); in set_debug_keys()
5445 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS, in set_debug_keys()
5448 hci_dev_lock(hdev); in set_debug_keys()
5451 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS); in set_debug_keys()
5453 changed = hci_dev_test_and_clear_flag(hdev, in set_debug_keys()
5457 use_changed = !hci_dev_test_and_set_flag(hdev, in set_debug_keys()
5460 use_changed = hci_dev_test_and_clear_flag(hdev, in set_debug_keys()
5463 if (hdev_is_powered(hdev) && use_changed && in set_debug_keys()
5464 hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_debug_keys()
5466 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, in set_debug_keys()
5470 err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev); in set_debug_keys()
5475 err = new_settings(hdev, sk); in set_debug_keys()
5478 hci_dev_unlock(hdev); in set_debug_keys()
5482 static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data, in set_privacy() argument
5489 BT_DBG("request for %s", hdev->name); in set_privacy()
5491 if (!lmp_le_capable(hdev)) in set_privacy()
5492 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5496 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5499 if (hdev_is_powered(hdev)) in set_privacy()
5500 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5503 hci_dev_lock(hdev); in set_privacy()
5508 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING); in set_privacy()
5511 changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY); in set_privacy()
5512 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk)); in set_privacy()
5513 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); in set_privacy()
5515 changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY); in set_privacy()
5516 memset(hdev->irk, 0, sizeof(hdev->irk)); in set_privacy()
5517 hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED); in set_privacy()
5520 err = send_settings_rsp(sk, MGMT_OP_SET_PRIVACY, hdev); in set_privacy()
5525 err = new_settings(hdev, sk); in set_privacy()
5528 hci_dev_unlock(hdev); in set_privacy()
5548 static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data, in load_irks() argument
5557 BT_DBG("request for %s", hdev->name); in load_irks()
5559 if (!lmp_le_capable(hdev)) in load_irks()
5560 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5566 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5574 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5578 BT_DBG("%s irk_count %u", hdev->name, irk_count); in load_irks()
5584 return mgmt_cmd_status(sk, hdev->id, in load_irks()
5589 hci_dev_lock(hdev); in load_irks()
5591 hci_smp_irks_clear(hdev); in load_irks()
5596 hci_add_irk(hdev, &irk->addr.bdaddr, in load_irks()
5601 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING); in load_irks()
5603 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0); in load_irks()
5605 hci_dev_unlock(hdev); in load_irks()
5629 static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev, in load_long_term_keys() argument
5638 BT_DBG("request for %s", hdev->name); in load_long_term_keys()
5640 if (!lmp_le_capable(hdev)) in load_long_term_keys()
5641 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5647 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5656 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5660 BT_DBG("%s key_count %u", hdev->name, key_count); in load_long_term_keys()
5666 return mgmt_cmd_status(sk, hdev->id, in load_long_term_keys()
5671 hci_dev_lock(hdev); in load_long_term_keys()
5673 hci_smp_ltks_clear(hdev); in load_long_term_keys()
5703 hci_add_ltk(hdev, &key->addr.bdaddr, in load_long_term_keys()
5708 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0, in load_long_term_keys()
5711 hci_dev_unlock(hdev); in load_long_term_keys()
5743 static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status, in conn_info_refresh_complete() argument
5754 hci_dev_lock(hdev); in conn_info_refresh_complete()
5765 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI); in conn_info_refresh_complete()
5767 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER); in conn_info_refresh_complete()
5779 conn = hci_conn_hash_lookup_handle(hdev, handle); in conn_info_refresh_complete()
5785 cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn); in conn_info_refresh_complete()
5793 hci_dev_unlock(hdev); in conn_info_refresh_complete()
5796 static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data, in get_conn_info() argument
5805 BT_DBG("%s", hdev->name); in get_conn_info()
5812 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5816 hci_dev_lock(hdev); in get_conn_info()
5818 if (!hdev_is_powered(hdev)) { in get_conn_info()
5819 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5826 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in get_conn_info()
5829 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info()
5832 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5838 if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) { in get_conn_info()
5839 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5847 conn_info_age = hdev->conn_info_min_age + in get_conn_info()
5848 prandom_u32_max(hdev->conn_info_max_age - in get_conn_info()
5849 hdev->conn_info_min_age); in get_conn_info()
5862 hci_req_init(&req, hdev); in get_conn_info()
5890 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CONN_INFO, hdev, in get_conn_info()
5908 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5913 hci_dev_unlock(hdev); in get_conn_info()
5921 struct hci_dev *hdev; in clock_info_cmd_complete() local
5930 hdev = hci_dev_get(cmd->index); in clock_info_cmd_complete()
5931 if (hdev) { in clock_info_cmd_complete()
5932 rp.local_clock = cpu_to_le32(hdev->clock); in clock_info_cmd_complete()
5933 hci_dev_put(hdev); in clock_info_cmd_complete()
5953 static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode) in get_clock_info_complete() argument
5959 BT_DBG("%s status %u", hdev->name, status); in get_clock_info_complete()
5961 hci_dev_lock(hdev); in get_clock_info_complete()
5963 hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK); in get_clock_info_complete()
5969 conn = hci_conn_hash_lookup_handle(hdev, handle); in get_clock_info_complete()
5974 cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn); in get_clock_info_complete()
5982 hci_dev_unlock(hdev); in get_clock_info_complete()
5985 static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data, in get_clock_info() argument
5996 BT_DBG("%s", hdev->name); in get_clock_info()
6003 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
6007 hci_dev_lock(hdev); in get_clock_info()
6009 if (!hdev_is_powered(hdev)) { in get_clock_info()
6010 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
6017 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in get_clock_info()
6020 err = mgmt_cmd_complete(sk, hdev->id, in get_clock_info()
6030 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CLOCK_INFO, hdev, data, len); in get_clock_info()
6038 hci_req_init(&req, hdev); in get_clock_info()
6057 hci_dev_unlock(hdev); in get_clock_info()
6061 static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type) in is_connected() argument
6065 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr); in is_connected()
6082 struct hci_dev *hdev = req->hdev; in hci_conn_params_set() local
6085 params = hci_conn_params_add(hdev, addr, addr_type); in hci_conn_params_set()
6101 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
6107 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
6109 list_add(¶ms->action, &hdev->pend_le_reports); in hci_conn_params_set()
6114 if (!is_connected(hdev, addr, addr_type)) { in hci_conn_params_set()
6115 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
6133 static void device_added(struct sock *sk, struct hci_dev *hdev, in device_added() argument
6142 mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk); in device_added()
6145 static void add_device_complete(struct hci_dev *hdev, u8 status, u16 opcode) in add_device_complete() argument
6151 hci_dev_lock(hdev); in add_device_complete()
6153 cmd = pending_find(MGMT_OP_ADD_DEVICE, hdev); in add_device_complete()
6161 hci_dev_unlock(hdev); in add_device_complete()
6164 static int add_device(struct sock *sk, struct hci_dev *hdev, in add_device() argument
6173 BT_DBG("%s", hdev->name); in add_device()
6177 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6182 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6186 hci_req_init(&req, hdev); in add_device()
6188 hci_dev_lock(hdev); in add_device()
6190 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_DEVICE, hdev, data, len); in add_device()
6207 err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr, in add_device()
6248 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action); in add_device()
6261 hci_dev_unlock(hdev); in add_device()
6265 static void device_removed(struct sock *sk, struct hci_dev *hdev, in device_removed() argument
6273 mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk); in device_removed()
6276 static void remove_device_complete(struct hci_dev *hdev, u8 status, u16 opcode) in remove_device_complete() argument
6282 hci_dev_lock(hdev); in remove_device_complete()
6284 cmd = pending_find(MGMT_OP_REMOVE_DEVICE, hdev); in remove_device_complete()
6292 hci_dev_unlock(hdev); in remove_device_complete()
6295 static int remove_device(struct sock *sk, struct hci_dev *hdev, in remove_device() argument
6303 BT_DBG("%s", hdev->name); in remove_device()
6305 hci_req_init(&req, hdev); in remove_device()
6307 hci_dev_lock(hdev); in remove_device()
6309 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_DEVICE, hdev, data, len); in remove_device()
6329 err = hci_bdaddr_list_del(&hdev->whitelist, in remove_device()
6341 device_removed(sk, hdev, &cp->addr.bdaddr, in remove_device()
6360 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in remove_device()
6382 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); in remove_device()
6394 list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) { in remove_device()
6395 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); in remove_device()
6402 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) { in remove_device()
6405 device_removed(sk, hdev, &p->addr, p->addr_type); in remove_device()
6432 hci_dev_unlock(hdev); in remove_device()
6436 static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data, in load_conn_param() argument
6445 if (!lmp_le_capable(hdev)) in load_conn_param()
6446 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6453 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6462 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6466 BT_DBG("%s param_count %u", hdev->name, param_count); in load_conn_param()
6468 hci_dev_lock(hdev); in load_conn_param()
6470 hci_conn_params_clear_disabled(hdev); in load_conn_param()
6503 hci_param = hci_conn_params_add(hdev, ¶m->addr.bdaddr, in load_conn_param()
6516 hci_dev_unlock(hdev); in load_conn_param()
6518 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0, in load_conn_param()
6522 static int set_external_config(struct sock *sk, struct hci_dev *hdev, in set_external_config() argument
6529 BT_DBG("%s", hdev->name); in set_external_config()
6531 if (hdev_is_powered(hdev)) in set_external_config()
6532 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6536 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6539 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in set_external_config()
6540 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6543 hci_dev_lock(hdev); in set_external_config()
6546 changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED); in set_external_config()
6548 changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED); in set_external_config()
6550 err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev); in set_external_config()
6557 err = new_options(hdev, sk); in set_external_config()
6559 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) { in set_external_config()
6560 mgmt_index_removed(hdev); in set_external_config()
6562 if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) { in set_external_config()
6563 hci_dev_set_flag(hdev, HCI_CONFIG); in set_external_config()
6564 hci_dev_set_flag(hdev, HCI_AUTO_OFF); in set_external_config()
6566 queue_work(hdev->req_workqueue, &hdev->power_on); in set_external_config()
6568 set_bit(HCI_RAW, &hdev->flags); in set_external_config()
6569 mgmt_index_added(hdev); in set_external_config()
6574 hci_dev_unlock(hdev); in set_external_config()
6578 static int set_public_address(struct sock *sk, struct hci_dev *hdev, in set_public_address() argument
6585 BT_DBG("%s", hdev->name); in set_public_address()
6587 if (hdev_is_powered(hdev)) in set_public_address()
6588 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6592 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6595 if (!hdev->set_bdaddr) in set_public_address()
6596 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6599 hci_dev_lock(hdev); in set_public_address()
6601 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr); in set_public_address()
6602 bacpy(&hdev->public_addr, &cp->bdaddr); in set_public_address()
6604 err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev); in set_public_address()
6611 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) in set_public_address()
6612 err = new_options(hdev, sk); in set_public_address()
6614 if (is_configured(hdev)) { in set_public_address()
6615 mgmt_index_removed(hdev); in set_public_address()
6617 hci_dev_clear_flag(hdev, HCI_UNCONFIGURED); in set_public_address()
6619 hci_dev_set_flag(hdev, HCI_CONFIG); in set_public_address()
6620 hci_dev_set_flag(hdev, HCI_AUTO_OFF); in set_public_address()
6622 queue_work(hdev->req_workqueue, &hdev->power_on); in set_public_address()
6626 hci_dev_unlock(hdev); in set_public_address()
6641 static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status, in read_local_oob_ext_data_complete() argument
6651 BT_DBG("%s status %u", hdev->name, status); in read_local_oob_ext_data_complete()
6653 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev); in read_local_oob_ext_data_complete()
6693 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in read_local_oob_ext_data_complete()
6716 hdev->dev_class, 3); in read_local_oob_ext_data_complete()
6736 err = mgmt_cmd_complete(cmd->sk, hdev->id, in read_local_oob_ext_data_complete()
6744 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev, in read_local_oob_ext_data_complete()
6752 static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk, in read_local_ssp_oob_req() argument
6759 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev, in read_local_ssp_oob_req()
6764 hci_req_init(&req, hdev); in read_local_ssp_oob_req()
6766 if (bredr_sc_enabled(hdev)) in read_local_ssp_oob_req()
6780 static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, in read_local_oob_ext_data() argument
6790 BT_DBG("%s", hdev->name); in read_local_oob_ext_data()
6792 if (hdev_is_powered(hdev)) { in read_local_oob_ext_data()
6795 status = mgmt_bredr_support(hdev); in read_local_oob_ext_data()
6802 status = mgmt_le_support(hdev); in read_local_oob_ext_data()
6826 hci_dev_lock(hdev); in read_local_oob_ext_data()
6831 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in read_local_oob_ext_data()
6832 err = read_local_ssp_oob_req(hdev, sk, cp); in read_local_oob_ext_data()
6833 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6842 hdev->dev_class, 3); in read_local_oob_ext_data()
6846 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) && in read_local_oob_ext_data()
6847 smp_generate_oob(hdev, hash, rand) < 0) { in read_local_oob_ext_data()
6848 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6863 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) { in read_local_oob_ext_data()
6864 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6869 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || in read_local_oob_ext_data()
6870 !bacmp(&hdev->bdaddr, BDADDR_ANY) || in read_local_oob_ext_data()
6871 (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in read_local_oob_ext_data()
6872 bacmp(&hdev->static_addr, BDADDR_ANY))) { in read_local_oob_ext_data()
6873 memcpy(addr, &hdev->static_addr, 6); in read_local_oob_ext_data()
6876 memcpy(addr, &hdev->bdaddr, 6); in read_local_oob_ext_data()
6883 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in read_local_oob_ext_data()
6891 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) { in read_local_oob_ext_data()
6901 flags = get_adv_discov_flags(hdev); in read_local_oob_ext_data()
6903 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in read_local_oob_ext_data()
6911 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6921 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, in read_local_oob_ext_data()
6926 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev, in read_local_oob_ext_data()
6936 static u32 get_supported_adv_flags(struct hci_dev *hdev) in get_supported_adv_flags() argument
6945 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) in get_supported_adv_flags()
6951 static int read_adv_features(struct sock *sk, struct hci_dev *hdev, in read_adv_features() argument
6961 BT_DBG("%s", hdev->name); in read_adv_features()
6963 if (!lmp_le_capable(hdev)) in read_adv_features()
6964 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
6967 hci_dev_lock(hdev); in read_adv_features()
6971 instance = hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE); in read_adv_features()
6973 rp_len += hdev->adv_instance_cnt; in read_adv_features()
6977 hci_dev_unlock(hdev); in read_adv_features()
6981 supported_flags = get_supported_adv_flags(hdev); in read_adv_features()
6990 list_for_each_entry(adv_instance, &hdev->adv_instances, list) { in read_adv_features()
6991 if (i >= hdev->adv_instance_cnt) in read_adv_features()
6997 rp->num_instances = hdev->adv_instance_cnt; in read_adv_features()
7002 hci_dev_unlock(hdev); in read_adv_features()
7004 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
7012 static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data, in tlv_data_is_valid() argument
7055 static void add_advertising_complete(struct hci_dev *hdev, u8 status, in add_advertising_complete() argument
7066 hci_dev_lock(hdev); in add_advertising_complete()
7068 cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev); in add_advertising_complete()
7071 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE); in add_advertising_complete()
7073 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) { in add_advertising_complete()
7084 if (hdev->cur_adv_instance == instance) in add_advertising_complete()
7085 cancel_adv_timeout(hdev); in add_advertising_complete()
7087 hci_remove_adv_instance(hdev, instance); in add_advertising_complete()
7088 advertising_removed(cmd ? cmd->sk : NULL, hdev, instance); in add_advertising_complete()
7107 hci_dev_unlock(hdev); in add_advertising_complete()
7110 void mgmt_adv_timeout_expired(struct hci_dev *hdev) in mgmt_adv_timeout_expired() argument
7115 hdev->adv_instance_timeout = 0; in mgmt_adv_timeout_expired()
7117 instance = get_current_adv_instance(hdev); in mgmt_adv_timeout_expired()
7121 hci_dev_lock(hdev); in mgmt_adv_timeout_expired()
7122 hci_req_init(&req, hdev); in mgmt_adv_timeout_expired()
7124 clear_adv_instance(hdev, &req, instance, false); in mgmt_adv_timeout_expired()
7126 if (list_empty(&hdev->adv_instances)) in mgmt_adv_timeout_expired()
7132 hci_dev_unlock(hdev); in mgmt_adv_timeout_expired()
7135 static int add_advertising(struct sock *sk, struct hci_dev *hdev, in add_advertising() argument
7144 unsigned int prev_instance_cnt = hdev->adv_instance_cnt; in add_advertising()
7151 BT_DBG("%s", hdev->name); in add_advertising()
7153 status = mgmt_le_support(hdev); in add_advertising()
7155 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7159 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7169 supported_flags = get_supported_adv_flags(hdev); in add_advertising()
7171 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7174 hci_dev_lock(hdev); in add_advertising()
7176 if (timeout && !hdev_is_powered(hdev)) { in add_advertising()
7177 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7182 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) || in add_advertising()
7183 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) || in add_advertising()
7184 pending_find(MGMT_OP_SET_LE, hdev)) { in add_advertising()
7185 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7190 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) || in add_advertising()
7191 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len, in add_advertising()
7193 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7198 err = hci_add_adv_instance(hdev, cp->instance, flags, in add_advertising()
7204 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7212 if (hdev->adv_instance_cnt > prev_instance_cnt) in add_advertising()
7213 advertising_added(sk, hdev, cp->instance); in add_advertising()
7215 hci_dev_set_flag(hdev, HCI_ADVERTISING_INSTANCE); in add_advertising()
7217 if (hdev->cur_adv_instance == cp->instance) { in add_advertising()
7223 cancel_adv_timeout(hdev); in add_advertising()
7225 next_instance = hci_get_next_instance(hdev, cp->instance); in add_advertising()
7228 } else if (!hdev->adv_instance_timeout) { in add_advertising()
7239 if (!hdev_is_powered(hdev) || in add_advertising()
7240 hci_dev_test_flag(hdev, HCI_ADVERTISING) || in add_advertising()
7243 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7251 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data, in add_advertising()
7258 hci_req_init(&req, hdev); in add_advertising()
7269 hci_dev_unlock(hdev); in add_advertising()
7274 static void remove_advertising_complete(struct hci_dev *hdev, u8 status, in remove_advertising_complete() argument
7283 hci_dev_lock(hdev); in remove_advertising_complete()
7289 cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev); in remove_advertising_complete()
7301 hci_dev_unlock(hdev); in remove_advertising_complete()
7304 static int remove_advertising(struct sock *sk, struct hci_dev *hdev, in remove_advertising() argument
7313 BT_DBG("%s", hdev->name); in remove_advertising()
7315 hci_dev_lock(hdev); in remove_advertising()
7317 if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) { in remove_advertising()
7318 err = mgmt_cmd_status(sk, hdev->id, in remove_advertising()
7324 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) || in remove_advertising()
7325 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) || in remove_advertising()
7326 pending_find(MGMT_OP_SET_LE, hdev)) { in remove_advertising()
7327 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7332 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) { in remove_advertising()
7333 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7338 hci_req_init(&req, hdev); in remove_advertising()
7340 clear_adv_instance(hdev, &req, cp->instance, true); in remove_advertising()
7342 if (list_empty(&hdev->adv_instances)) in remove_advertising()
7350 !hdev_is_powered(hdev) || in remove_advertising()
7351 hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in remove_advertising()
7353 err = mgmt_cmd_complete(sk, hdev->id, in remove_advertising()
7359 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADVERTISING, hdev, data, in remove_advertising()
7371 hci_dev_unlock(hdev); in remove_advertising()
7465 void mgmt_index_added(struct hci_dev *hdev) in mgmt_index_added() argument
7469 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_added()
7472 switch (hdev->dev_type) { in mgmt_index_added()
7474 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { in mgmt_index_added()
7475 mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev, in mgmt_index_added()
7479 mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, in mgmt_index_added()
7491 ev.bus = hdev->bus; in mgmt_index_added()
7493 mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev), in mgmt_index_added()
7497 void mgmt_index_removed(struct hci_dev *hdev) in mgmt_index_removed() argument
7502 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_removed()
7505 switch (hdev->dev_type) { in mgmt_index_removed()
7507 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); in mgmt_index_removed()
7509 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { in mgmt_index_removed()
7510 mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, in mgmt_index_removed()
7514 mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, in mgmt_index_removed()
7526 ev.bus = hdev->bus; in mgmt_index_removed()
7528 mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev), in mgmt_index_removed()
7535 struct hci_dev *hdev = req->hdev; in restart_le_actions() local
7538 list_for_each_entry(p, &hdev->le_conn_params, list) { in restart_le_actions()
7547 list_add(&p->action, &hdev->pend_le_conns); in restart_le_actions()
7550 list_add(&p->action, &hdev->pend_le_reports); in restart_le_actions()
7560 static void powered_complete(struct hci_dev *hdev, u8 status, u16 opcode) in powered_complete() argument
7562 struct cmd_lookup match = { NULL, hdev }; in powered_complete()
7572 smp_register(hdev); in powered_complete()
7575 hci_dev_lock(hdev); in powered_complete()
7577 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); in powered_complete()
7579 new_settings(hdev, match.sk); in powered_complete()
7581 hci_dev_unlock(hdev); in powered_complete()
7587 static int powered_update_hci(struct hci_dev *hdev) in powered_update_hci() argument
7593 hci_req_init(&req, hdev); in powered_update_hci()
7595 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) && in powered_update_hci()
7596 !lmp_host_ssp_capable(hdev)) { in powered_update_hci()
7601 if (bredr_sc_enabled(hdev) && !lmp_host_sc_capable(hdev)) { in powered_update_hci()
7609 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in powered_update_hci()
7610 lmp_bredr_capable(hdev)) { in powered_update_hci()
7619 if (cp.le != lmp_host_le_capable(hdev) || in powered_update_hci()
7620 cp.simul != lmp_host_le_br_capable(hdev)) in powered_update_hci()
7625 if (lmp_le_capable(hdev)) { in powered_update_hci()
7630 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in powered_update_hci()
7631 (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in powered_update_hci()
7632 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))) { in powered_update_hci()
7637 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) && in powered_update_hci()
7638 hdev->cur_adv_instance == 0x00 && in powered_update_hci()
7639 !list_empty(&hdev->adv_instances)) { in powered_update_hci()
7640 adv_instance = list_first_entry(&hdev->adv_instances, in powered_update_hci()
7642 hdev->cur_adv_instance = adv_instance->instance; in powered_update_hci()
7645 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in powered_update_hci()
7647 else if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) && in powered_update_hci()
7648 hdev->cur_adv_instance) in powered_update_hci()
7649 schedule_adv_instance(&req, hdev->cur_adv_instance, in powered_update_hci()
7655 link_sec = hci_dev_test_flag(hdev, HCI_LINK_SECURITY); in powered_update_hci()
7656 if (link_sec != test_bit(HCI_AUTH, &hdev->flags)) in powered_update_hci()
7660 if (lmp_bredr_capable(hdev)) { in powered_update_hci()
7661 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) in powered_update_hci()
7674 int mgmt_powered(struct hci_dev *hdev, u8 powered) in mgmt_powered() argument
7676 struct cmd_lookup match = { NULL, hdev }; in mgmt_powered()
7680 if (!hci_dev_test_flag(hdev, HCI_MGMT)) in mgmt_powered()
7684 if (powered_update_hci(hdev) == 0) in mgmt_powered()
7687 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, in mgmt_powered()
7692 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); in mgmt_powered()
7701 if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) in mgmt_powered()
7706 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); in mgmt_powered()
7708 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) in mgmt_powered()
7709 mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, in mgmt_powered()
7713 err = new_settings(hdev, match.sk); in mgmt_powered()
7721 void mgmt_set_powered_failed(struct hci_dev *hdev, int err) in mgmt_set_powered_failed() argument
7726 cmd = pending_find(MGMT_OP_SET_POWERED, hdev); in mgmt_set_powered_failed()
7735 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); in mgmt_set_powered_failed()
7740 void mgmt_discoverable_timeout(struct hci_dev *hdev) in mgmt_discoverable_timeout() argument
7744 hci_dev_lock(hdev); in mgmt_discoverable_timeout()
7751 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in mgmt_discoverable_timeout()
7752 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in mgmt_discoverable_timeout()
7754 hci_req_init(&req, hdev); in mgmt_discoverable_timeout()
7755 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in mgmt_discoverable_timeout()
7765 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in mgmt_discoverable_timeout()
7770 hdev->discov_timeout = 0; in mgmt_discoverable_timeout()
7772 new_settings(hdev, NULL); in mgmt_discoverable_timeout()
7774 hci_dev_unlock(hdev); in mgmt_discoverable_timeout()
7777 void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, in mgmt_new_link_key() argument
7791 mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL); in mgmt_new_link_key()
7813 void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent) in mgmt_new_ltk() argument
7853 mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL); in mgmt_new_ltk()
7856 void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent) in mgmt_new_irk() argument
7869 mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL); in mgmt_new_irk()
7872 void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk, in mgmt_new_csrk() argument
7899 mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL); in mgmt_new_csrk()
7902 void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_new_conn_param() argument
7920 mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL); in mgmt_new_conn_param()
7923 void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn, in mgmt_device_connected() argument
7956 mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf, in mgmt_device_connected()
7974 struct hci_dev *hdev = data; in unpair_device_rsp() local
7977 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_rsp()
7983 bool mgmt_powering_down(struct hci_dev *hdev) in mgmt_powering_down() argument
7988 cmd = pending_find(MGMT_OP_SET_POWERED, hdev); in mgmt_powering_down()
7999 void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_device_disconnected() argument
8009 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) { in mgmt_device_disconnected()
8010 cancel_delayed_work(&hdev->power_off); in mgmt_device_disconnected()
8011 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_device_disconnected()
8020 mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk); in mgmt_device_disconnected()
8026 mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk); in mgmt_device_disconnected()
8031 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, in mgmt_device_disconnected()
8032 hdev); in mgmt_device_disconnected()
8035 void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_disconnect_failed() argument
8042 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, in mgmt_disconnect_failed()
8043 hdev); in mgmt_disconnect_failed()
8045 cmd = pending_find(MGMT_OP_DISCONNECT, hdev); in mgmt_disconnect_failed()
8061 void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_connect_failed() argument
8069 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) { in mgmt_connect_failed()
8070 cancel_delayed_work(&hdev->power_off); in mgmt_connect_failed()
8071 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_connect_failed()
8078 mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL); in mgmt_connect_failed()
8081 void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure) in mgmt_pin_code_request() argument
8089 mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL); in mgmt_pin_code_request()
8092 void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_pin_code_reply_complete() argument
8097 cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev); in mgmt_pin_code_reply_complete()
8105 void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_pin_code_neg_reply_complete() argument
8110 cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev); in mgmt_pin_code_neg_reply_complete()
8118 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_request() argument
8124 BT_DBG("%s", hdev->name); in mgmt_user_confirm_request()
8131 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev), in mgmt_user_confirm_request()
8135 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_request() argument
8140 BT_DBG("%s", hdev->name); in mgmt_user_passkey_request()
8145 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev), in mgmt_user_passkey_request()
8149 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in user_pairing_resp_complete() argument
8155 cmd = pending_find(opcode, hdev); in user_pairing_resp_complete()
8165 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_reply_complete() argument
8168 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_confirm_reply_complete()
8172 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_neg_reply_complete() argument
8175 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_confirm_neg_reply_complete()
8180 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_reply_complete() argument
8183 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_passkey_reply_complete()
8187 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_neg_reply_complete() argument
8190 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_passkey_neg_reply_complete()
8195 int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_notify() argument
8201 BT_DBG("%s", hdev->name); in mgmt_user_passkey_notify()
8208 return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL); in mgmt_user_passkey_notify()
8223 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev), in mgmt_auth_failed()
8232 void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) in mgmt_auth_enable_complete() argument
8234 struct cmd_lookup match = { NULL, hdev }; in mgmt_auth_enable_complete()
8239 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, in mgmt_auth_enable_complete()
8244 if (test_bit(HCI_AUTH, &hdev->flags)) in mgmt_auth_enable_complete()
8245 changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY); in mgmt_auth_enable_complete()
8247 changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY); in mgmt_auth_enable_complete()
8249 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp, in mgmt_auth_enable_complete()
8253 new_settings(hdev, match.sk); in mgmt_auth_enable_complete()
8261 struct hci_dev *hdev = req->hdev; in clear_eir() local
8264 if (!lmp_ext_inq_capable(hdev)) in clear_eir()
8267 memset(hdev->eir, 0, sizeof(hdev->eir)); in clear_eir()
8274 void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status) in mgmt_ssp_enable_complete() argument
8276 struct cmd_lookup match = { NULL, hdev }; in mgmt_ssp_enable_complete()
8283 if (enable && hci_dev_test_and_clear_flag(hdev, in mgmt_ssp_enable_complete()
8285 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in mgmt_ssp_enable_complete()
8286 new_settings(hdev, NULL); in mgmt_ssp_enable_complete()
8289 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp, in mgmt_ssp_enable_complete()
8295 changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED); in mgmt_ssp_enable_complete()
8297 changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED); in mgmt_ssp_enable_complete()
8299 changed = hci_dev_test_and_clear_flag(hdev, in mgmt_ssp_enable_complete()
8302 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in mgmt_ssp_enable_complete()
8305 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match); in mgmt_ssp_enable_complete()
8308 new_settings(hdev, match.sk); in mgmt_ssp_enable_complete()
8313 hci_req_init(&req, hdev); in mgmt_ssp_enable_complete()
8315 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in mgmt_ssp_enable_complete()
8316 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in mgmt_ssp_enable_complete()
8337 void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, in mgmt_set_class_of_dev_complete() argument
8340 struct cmd_lookup match = { NULL, hdev, mgmt_status(status) }; in mgmt_set_class_of_dev_complete()
8342 mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
8343 mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
8344 mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
8347 mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, in mgmt_set_class_of_dev_complete()
8354 void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status) in mgmt_set_local_name_complete() argument
8364 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); in mgmt_set_local_name_complete()
8366 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); in mgmt_set_local_name_complete()
8368 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); in mgmt_set_local_name_complete()
8373 if (pending_find(MGMT_OP_SET_POWERED, hdev)) in mgmt_set_local_name_complete()
8377 mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev), in mgmt_set_local_name_complete()
8448 static void restart_le_scan(struct hci_dev *hdev) in restart_le_scan() argument
8451 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN)) in restart_le_scan()
8455 hdev->discovery.scan_start + in restart_le_scan()
8456 hdev->discovery.scan_duration)) in restart_le_scan()
8459 queue_delayed_work(hdev->workqueue, &hdev->le_scan_restart, in restart_le_scan()
8463 static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir, in is_filter_match() argument
8475 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
8477 (rssi < hdev->discovery.rssi && in is_filter_match()
8478 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)))) in is_filter_match()
8481 if (hdev->discovery.uuid_count != 0) { in is_filter_match()
8485 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count, in is_filter_match()
8486 hdev->discovery.uuids) && in is_filter_match()
8488 hdev->discovery.uuid_count, in is_filter_match()
8489 hdev->discovery.uuids)) in is_filter_match()
8496 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) { in is_filter_match()
8497 restart_le_scan(hdev); in is_filter_match()
8500 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
8501 rssi < hdev->discovery.rssi) in is_filter_match()
8508 void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_device_found() argument
8520 if (!hci_discovery_active(hdev)) { in mgmt_device_found()
8523 if (link_type == LE_LINK && list_empty(&hdev->pend_le_reports)) in mgmt_device_found()
8527 if (hdev->discovery.result_filtering) { in mgmt_device_found()
8529 if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp, in mgmt_device_found()
8550 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi && in mgmt_device_found()
8574 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL); in mgmt_device_found()
8577 void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_remote_name() argument
8597 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL); in mgmt_remote_name()
8600 void mgmt_discovering(struct hci_dev *hdev, u8 discovering) in mgmt_discovering() argument
8604 BT_DBG("%s discovering %u", hdev->name, discovering); in mgmt_discovering()
8607 ev.type = hdev->discovery.type; in mgmt_discovering()
8610 mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL); in mgmt_discovering()
8613 static void adv_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in adv_enable_complete() argument
8615 BT_DBG("%s status %u", hdev->name, status); in adv_enable_complete()
8618 void mgmt_reenable_advertising(struct hci_dev *hdev) in mgmt_reenable_advertising() argument
8623 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING) && in mgmt_reenable_advertising()
8624 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in mgmt_reenable_advertising()
8627 instance = get_current_adv_instance(hdev); in mgmt_reenable_advertising()
8629 hci_req_init(&req, hdev); in mgmt_reenable_advertising()