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()
271 static int read_version(struct sock *sk, struct hci_dev *hdev, void *data, in read_version() argument
285 static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data, in read_commands() argument
337 static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data, in read_index_list() argument
397 static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev, in read_unconf_index_list() argument
457 static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev, in read_ext_index_list() argument
533 static bool is_configured(struct hci_dev *hdev) in is_configured() argument
535 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in is_configured()
536 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED)) in is_configured()
539 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) && in is_configured()
540 !bacmp(&hdev->public_addr, BDADDR_ANY)) in is_configured()
546 static __le32 get_missing_options(struct hci_dev *hdev) in get_missing_options() argument
550 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in get_missing_options()
551 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED)) in get_missing_options()
554 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) && in get_missing_options()
555 !bacmp(&hdev->public_addr, BDADDR_ANY)) in get_missing_options()
561 static int new_options(struct hci_dev *hdev, struct sock *skip) in new_options() argument
563 __le32 options = get_missing_options(hdev); in new_options()
565 return mgmt_generic_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options, in new_options()
569 static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) in send_options_rsp() argument
571 __le32 options = get_missing_options(hdev); in send_options_rsp()
573 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options, in send_options_rsp()
577 static int read_config_info(struct sock *sk, struct hci_dev *hdev, in read_config_info() argument
583 BT_DBG("sock %p %s", sk, hdev->name); in read_config_info()
585 hci_dev_lock(hdev); in read_config_info()
588 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_config_info()
590 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in read_config_info()
593 if (hdev->set_bdaddr) in read_config_info()
597 rp.missing_options = get_missing_options(hdev); in read_config_info()
599 hci_dev_unlock(hdev); in read_config_info()
601 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0, in read_config_info()
605 static u32 get_supported_settings(struct hci_dev *hdev) in get_supported_settings() argument
615 if (lmp_bredr_capable(hdev)) { in get_supported_settings()
616 if (hdev->hci_ver >= BLUETOOTH_VER_1_2) in get_supported_settings()
621 if (lmp_ssp_capable(hdev)) { in get_supported_settings()
626 if (lmp_sc_capable(hdev)) in get_supported_settings()
630 if (lmp_le_capable(hdev)) { in get_supported_settings()
638 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || in get_supported_settings()
639 hdev->set_bdaddr) in get_supported_settings()
645 static u32 get_current_settings(struct hci_dev *hdev) in get_current_settings() argument
649 if (hdev_is_powered(hdev)) in get_current_settings()
652 if (hci_dev_test_flag(hdev, HCI_CONNECTABLE)) in get_current_settings()
655 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) in get_current_settings()
658 if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) in get_current_settings()
661 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) in get_current_settings()
664 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in get_current_settings()
667 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in get_current_settings()
670 if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) in get_current_settings()
673 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in get_current_settings()
676 if (hci_dev_test_flag(hdev, HCI_HS_ENABLED)) in get_current_settings()
679 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in get_current_settings()
682 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) in get_current_settings()
685 if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) in get_current_settings()
688 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) in get_current_settings()
703 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || in get_current_settings()
704 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) || in get_current_settings()
705 !bacmp(&hdev->bdaddr, BDADDR_ANY)) { in get_current_settings()
706 if (bacmp(&hdev->static_addr, BDADDR_ANY)) in get_current_settings()
715 static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len) in create_uuid16_list() argument
723 list_for_each_entry(uuid, &hdev->uuids, list) { in create_uuid16_list()
757 static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len) in create_uuid32_list() argument
765 list_for_each_entry(uuid, &hdev->uuids, list) { in create_uuid32_list()
790 static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len) in create_uuid128_list() argument
798 list_for_each_entry(uuid, &hdev->uuids, list) { in create_uuid128_list()
823 static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev) in pending_find() argument
825 return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev); in pending_find()
829 struct hci_dev *hdev, in pending_find_data() argument
832 return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data); in pending_find_data()
835 static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) in create_default_scan_rsp_data() argument
840 name_len = strlen(hdev->dev_name); in create_default_scan_rsp_data()
852 memcpy(ptr + 2, hdev->dev_name, name_len); in create_default_scan_rsp_data()
861 static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) in create_instance_scan_rsp_data() argument
866 memcpy(ptr, hdev->adv_instance.scan_rsp_data, in create_instance_scan_rsp_data()
867 hdev->adv_instance.scan_rsp_len); in create_instance_scan_rsp_data()
869 return hdev->adv_instance.scan_rsp_len; in create_instance_scan_rsp_data()
875 struct hci_dev *hdev = req->hdev; in update_scan_rsp_data_for_instance() local
879 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in update_scan_rsp_data_for_instance()
885 len = create_instance_scan_rsp_data(hdev, cp.data); in update_scan_rsp_data_for_instance()
887 len = create_default_scan_rsp_data(hdev, cp.data); in update_scan_rsp_data_for_instance()
889 if (hdev->scan_rsp_data_len == len && in update_scan_rsp_data_for_instance()
890 !memcmp(cp.data, hdev->scan_rsp_data, len)) in update_scan_rsp_data_for_instance()
893 memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data)); in update_scan_rsp_data_for_instance()
894 hdev->scan_rsp_data_len = len; in update_scan_rsp_data_for_instance()
903 struct hci_dev *hdev = req->hdev; in update_scan_rsp_data() local
911 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) && in update_scan_rsp_data()
912 !hci_dev_test_flag(hdev, HCI_ADVERTISING)) in update_scan_rsp_data()
920 static u8 get_adv_discov_flags(struct hci_dev *hdev) in get_adv_discov_flags() argument
927 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); in get_adv_discov_flags()
935 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) in get_adv_discov_flags()
937 else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) in get_adv_discov_flags()
944 static u8 get_current_adv_instance(struct hci_dev *hdev) in get_current_adv_instance() argument
951 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) && in get_current_adv_instance()
952 !hci_dev_test_flag(hdev, HCI_ADVERTISING)) in get_current_adv_instance()
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
983 return hdev->adv_instance.flags; in get_adv_instance_flags()
991 if (hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) in get_adv_instance_flags()
997 static u8 get_adv_instance_scan_rsp_len(struct hci_dev *hdev, u8 instance) in get_adv_instance_scan_rsp_len() argument
1006 return hdev->adv_instance.scan_rsp_len; in get_adv_instance_scan_rsp_len()
1009 static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) in create_instance_adv_data() argument
1012 u32 instance_flags = get_adv_instance_flags(hdev, instance); in create_instance_adv_data()
1028 flags |= get_adv_discov_flags(hdev); in create_instance_adv_data()
1030 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in create_instance_adv_data()
1047 memcpy(ptr, hdev->adv_instance.adv_data, in create_instance_adv_data()
1048 hdev->adv_instance.adv_data_len); in create_instance_adv_data()
1050 ad_len += hdev->adv_instance.adv_data_len; in create_instance_adv_data()
1051 ptr += hdev->adv_instance.adv_data_len; in create_instance_adv_data()
1055 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID && in create_instance_adv_data()
1059 ptr[2] = (u8)hdev->adv_tx_power; in create_instance_adv_data()
1070 struct hci_dev *hdev = req->hdev; in update_adv_data_for_instance() local
1074 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in update_adv_data_for_instance()
1079 len = create_instance_adv_data(hdev, instance, cp.data); in update_adv_data_for_instance()
1082 if (hdev->adv_data_len == len && in update_adv_data_for_instance()
1083 memcmp(cp.data, hdev->adv_data, len) == 0) in update_adv_data_for_instance()
1086 memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); in update_adv_data_for_instance()
1087 hdev->adv_data_len = len; in update_adv_data_for_instance()
1096 struct hci_dev *hdev = req->hdev; in update_adv_data() local
1097 u8 instance = get_current_adv_instance(hdev); in update_adv_data()
1102 int mgmt_update_adv_data(struct hci_dev *hdev) in mgmt_update_adv_data() argument
1106 hci_req_init(&req, hdev); in mgmt_update_adv_data()
1112 static void create_eir(struct hci_dev *hdev, u8 *data) in create_eir() argument
1117 name_len = strlen(hdev->dev_name); in create_eir()
1130 memcpy(ptr + 2, hdev->dev_name, name_len); in create_eir()
1135 if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) { in create_eir()
1138 ptr[2] = (u8) hdev->inq_tx_power; in create_eir()
1143 if (hdev->devid_source > 0) { in create_eir()
1147 put_unaligned_le16(hdev->devid_source, ptr + 2); in create_eir()
1148 put_unaligned_le16(hdev->devid_vendor, ptr + 4); in create_eir()
1149 put_unaligned_le16(hdev->devid_product, ptr + 6); in create_eir()
1150 put_unaligned_le16(hdev->devid_version, ptr + 8); in create_eir()
1155 ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data)); in create_eir()
1156 ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data)); in create_eir()
1157 ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data)); in create_eir()
1162 struct hci_dev *hdev = req->hdev; in update_eir() local
1165 if (!hdev_is_powered(hdev)) in update_eir()
1168 if (!lmp_ext_inq_capable(hdev)) in update_eir()
1171 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in update_eir()
1174 if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE)) in update_eir()
1179 create_eir(hdev, cp.data); in update_eir()
1181 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0) in update_eir()
1184 memcpy(hdev->eir, cp.data, sizeof(cp.data)); in update_eir()
1189 static u8 get_service_classes(struct hci_dev *hdev) in get_service_classes() argument
1194 list_for_each_entry(uuid, &hdev->uuids, list) in get_service_classes()
1202 struct hci_dev *hdev = req->hdev; in update_class() local
1205 BT_DBG("%s", hdev->name); in update_class()
1207 if (!hdev_is_powered(hdev)) in update_class()
1210 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in update_class()
1213 if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE)) in update_class()
1216 cod[0] = hdev->minor_class; in update_class()
1217 cod[1] = hdev->major_class; in update_class()
1218 cod[2] = get_service_classes(hdev); in update_class()
1220 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) in update_class()
1223 if (memcmp(cod, hdev->dev_class, 3) == 0) in update_class()
1238 struct hci_dev *hdev = req->hdev; in enable_advertising() local
1245 if (hci_conn_num(hdev, LE_LINK) > 0) in enable_advertising()
1248 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in enable_advertising()
1256 hci_dev_clear_flag(hdev, HCI_LE_ADV); in enable_advertising()
1258 instance = get_current_adv_instance(hdev); in enable_advertising()
1259 flags = get_adv_instance_flags(hdev, instance); in enable_advertising()
1265 get_connectable(hdev); in enable_advertising()
1275 cp.min_interval = cpu_to_le16(hdev->le_adv_min_interval); in enable_advertising()
1276 cp.max_interval = cpu_to_le16(hdev->le_adv_max_interval); in enable_advertising()
1280 else if (get_adv_instance_scan_rsp_len(hdev, instance)) in enable_advertising()
1286 cp.channel_map = hdev->le_adv_channel_map; in enable_advertising()
1295 struct hci_dev *hdev = container_of(work, struct hci_dev, in service_cache_off() local
1299 if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) in service_cache_off()
1302 hci_req_init(&req, hdev); in service_cache_off()
1304 hci_dev_lock(hdev); in service_cache_off()
1309 hci_dev_unlock(hdev); in service_cache_off()
1316 struct hci_dev *hdev = container_of(work, struct hci_dev, in rpa_expired() local
1322 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); in rpa_expired()
1324 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING)) in rpa_expired()
1330 hci_req_init(&req, hdev); in rpa_expired()
1335 static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev) in mgmt_init_hdev() argument
1337 if (hci_dev_test_and_set_flag(hdev, HCI_MGMT)) in mgmt_init_hdev()
1340 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off); in mgmt_init_hdev()
1341 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired); in mgmt_init_hdev()
1348 hci_dev_clear_flag(hdev, HCI_BONDABLE); in mgmt_init_hdev()
1351 static int read_controller_info(struct sock *sk, struct hci_dev *hdev, in read_controller_info() argument
1356 BT_DBG("sock %p %s", sk, hdev->name); in read_controller_info()
1358 hci_dev_lock(hdev); in read_controller_info()
1362 bacpy(&rp.bdaddr, &hdev->bdaddr); in read_controller_info()
1364 rp.version = hdev->hci_ver; in read_controller_info()
1365 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_controller_info()
1367 rp.supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_controller_info()
1368 rp.current_settings = cpu_to_le32(get_current_settings(hdev)); in read_controller_info()
1370 memcpy(rp.dev_class, hdev->dev_class, 3); in read_controller_info()
1372 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); in read_controller_info()
1373 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name)); in read_controller_info()
1375 hci_dev_unlock(hdev); in read_controller_info()
1377 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp, in read_controller_info()
1381 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) in send_settings_rsp() argument
1383 __le32 settings = cpu_to_le32(get_current_settings(hdev)); in send_settings_rsp()
1385 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings, in send_settings_rsp()
1389 static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode) in clean_up_hci_complete() argument
1391 BT_DBG("%s status 0x%02x", hdev->name, status); in clean_up_hci_complete()
1393 if (hci_conn_count(hdev) == 0) { in clean_up_hci_complete()
1394 cancel_delayed_work(&hdev->power_off); in clean_up_hci_complete()
1395 queue_work(hdev->req_workqueue, &hdev->power_off.work); in clean_up_hci_complete()
1401 struct hci_dev *hdev = req->hdev; in hci_stop_discovery() local
1405 switch (hdev->discovery.state) { in hci_stop_discovery()
1407 if (test_bit(HCI_INQUIRY, &hdev->flags)) in hci_stop_discovery()
1410 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) { in hci_stop_discovery()
1411 cancel_delayed_work(&hdev->le_scan_disable); in hci_stop_discovery()
1418 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, in hci_stop_discovery()
1431 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) { in hci_stop_discovery()
1442 static void advertising_added(struct sock *sk, struct hci_dev *hdev, in advertising_added() argument
1449 mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk); in advertising_added()
1452 static void advertising_removed(struct sock *sk, struct hci_dev *hdev, in advertising_removed() argument
1459 mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk); in advertising_removed()
1462 static void clear_adv_instance(struct hci_dev *hdev) in clear_adv_instance() argument
1466 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in clear_adv_instance()
1469 if (hdev->adv_instance.timeout) in clear_adv_instance()
1470 cancel_delayed_work(&hdev->adv_instance.timeout_exp); in clear_adv_instance()
1472 memset(&hdev->adv_instance, 0, sizeof(hdev->adv_instance)); in clear_adv_instance()
1473 advertising_removed(NULL, hdev, 1); in clear_adv_instance()
1474 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE); in clear_adv_instance()
1476 if (!hdev_is_powered(hdev) || in clear_adv_instance()
1477 hci_dev_test_flag(hdev, HCI_ADVERTISING)) in clear_adv_instance()
1480 hci_req_init(&req, hdev); in clear_adv_instance()
1485 static int clean_up_hci_state(struct hci_dev *hdev) in clean_up_hci_state() argument
1492 hci_req_init(&req, hdev); in clean_up_hci_state()
1494 if (test_bit(HCI_ISCAN, &hdev->flags) || in clean_up_hci_state()
1495 test_bit(HCI_PSCAN, &hdev->flags)) { in clean_up_hci_state()
1500 if (hdev->adv_instance.timeout) in clean_up_hci_state()
1501 clear_adv_instance(hdev); in clean_up_hci_state()
1503 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in clean_up_hci_state()
1508 list_for_each_entry(conn, &hdev->conn_hash.list, list) { in clean_up_hci_state()
1542 hci_discovery_set_state(hdev, DISCOVERY_STOPPING); in clean_up_hci_state()
1547 static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data, in set_powered() argument
1554 BT_DBG("request for %s", hdev->name); in set_powered()
1557 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1560 hci_dev_lock(hdev); in set_powered()
1562 if (pending_find(MGMT_OP_SET_POWERED, hdev)) { in set_powered()
1563 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1568 if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) { in set_powered()
1569 cancel_delayed_work(&hdev->power_off); in set_powered()
1572 mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, in set_powered()
1574 err = mgmt_powered(hdev, 1); in set_powered()
1579 if (!!cp->val == hdev_is_powered(hdev)) { in set_powered()
1580 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev); in set_powered()
1584 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len); in set_powered()
1591 queue_work(hdev->req_workqueue, &hdev->power_on); in set_powered()
1595 err = clean_up_hci_state(hdev); in set_powered()
1597 queue_delayed_work(hdev->req_workqueue, &hdev->power_off, in set_powered()
1602 cancel_delayed_work(&hdev->power_off); in set_powered()
1603 queue_work(hdev->req_workqueue, &hdev->power_off.work); in set_powered()
1609 hci_dev_unlock(hdev); in set_powered()
1613 static int new_settings(struct hci_dev *hdev, struct sock *skip) in new_settings() argument
1615 __le32 ev = cpu_to_le32(get_current_settings(hdev)); in new_settings()
1617 return mgmt_generic_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, in new_settings()
1621 int mgmt_new_settings(struct hci_dev *hdev) in mgmt_new_settings() argument
1623 return new_settings(hdev, NULL); in mgmt_new_settings()
1628 struct hci_dev *hdev; member
1636 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); in settings_rsp()
1682 static u8 mgmt_bredr_support(struct hci_dev *hdev) in mgmt_bredr_support() argument
1684 if (!lmp_bredr_capable(hdev)) in mgmt_bredr_support()
1686 else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in mgmt_bredr_support()
1692 static u8 mgmt_le_support(struct hci_dev *hdev) in mgmt_le_support() argument
1694 if (!lmp_le_capable(hdev)) in mgmt_le_support()
1696 else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in mgmt_le_support()
1702 static void set_discoverable_complete(struct hci_dev *hdev, u8 status, in set_discoverable_complete() argument
1712 hci_dev_lock(hdev); in set_discoverable_complete()
1714 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable_complete()
1721 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable_complete()
1727 changed = !hci_dev_test_and_set_flag(hdev, HCI_DISCOVERABLE); in set_discoverable_complete()
1729 if (hdev->discov_timeout > 0) { in set_discoverable_complete()
1730 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable_complete()
1731 queue_delayed_work(hdev->workqueue, &hdev->discov_off, in set_discoverable_complete()
1735 changed = hci_dev_test_and_clear_flag(hdev, HCI_DISCOVERABLE); in set_discoverable_complete()
1738 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable_complete()
1741 new_settings(hdev, cmd->sk); in set_discoverable_complete()
1748 hci_req_init(&req, hdev); in set_discoverable_complete()
1757 hci_dev_unlock(hdev); in set_discoverable_complete()
1760 static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data, in set_discoverable() argument
1770 BT_DBG("request for %s", hdev->name); in set_discoverable()
1772 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in set_discoverable()
1773 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_discoverable()
1774 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1778 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1788 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1791 hci_dev_lock(hdev); in set_discoverable()
1793 if (!hdev_is_powered(hdev) && timeout > 0) { in set_discoverable()
1794 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1799 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || in set_discoverable()
1800 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { in set_discoverable()
1801 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1806 if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) { in set_discoverable()
1807 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1812 if (!hdev_is_powered(hdev)) { in set_discoverable()
1819 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) { in set_discoverable()
1820 hci_dev_change_flag(hdev, HCI_DISCOVERABLE); in set_discoverable()
1824 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable()
1829 err = new_settings(hdev, sk); in set_discoverable()
1838 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_discoverable()
1839 (cp->val == 0x02) == hci_dev_test_flag(hdev, in set_discoverable()
1841 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1842 hdev->discov_timeout = timeout; in set_discoverable()
1844 if (cp->val && hdev->discov_timeout > 0) { in set_discoverable()
1845 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable()
1846 queue_delayed_work(hdev->workqueue, &hdev->discov_off, in set_discoverable()
1850 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable()
1854 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len); in set_discoverable()
1864 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1865 hdev->discov_timeout = timeout; in set_discoverable()
1869 hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1871 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1873 hci_req_init(&req, hdev); in set_discoverable()
1878 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_discoverable()
1888 hci_cp.num_iac = min_t(u8, hdev->num_iac, 2); in set_discoverable()
1908 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1921 hci_dev_unlock(hdev); in set_discoverable()
1927 struct hci_dev *hdev = req->hdev; in write_fast_connectable() local
1931 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in write_fast_connectable()
1934 if (hdev->hci_ver < BLUETOOTH_VER_1_2) in write_fast_connectable()
1951 if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval || in write_fast_connectable()
1952 __cpu_to_le16(hdev->page_scan_window) != acp.window) in write_fast_connectable()
1956 if (hdev->page_scan_type != type) in write_fast_connectable()
1960 static void set_connectable_complete(struct hci_dev *hdev, u8 status, in set_connectable_complete() argument
1969 hci_dev_lock(hdev); in set_connectable_complete()
1971 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_complete()
1983 conn_changed = !hci_dev_test_and_set_flag(hdev, in set_connectable_complete()
1987 conn_changed = hci_dev_test_and_clear_flag(hdev, in set_connectable_complete()
1989 discov_changed = hci_dev_test_and_clear_flag(hdev, in set_connectable_complete()
1993 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_complete()
1996 new_settings(hdev, cmd->sk); in set_connectable_complete()
1997 hci_update_page_scan(hdev); in set_connectable_complete()
1999 mgmt_update_adv_data(hdev); in set_connectable_complete()
2000 hci_update_background_scan(hdev); in set_connectable_complete()
2007 hci_dev_unlock(hdev); in set_connectable_complete()
2010 static int set_connectable_update_settings(struct hci_dev *hdev, in set_connectable_update_settings() argument
2016 if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE)) in set_connectable_update_settings()
2020 hci_dev_set_flag(hdev, HCI_CONNECTABLE); in set_connectable_update_settings()
2022 hci_dev_clear_flag(hdev, HCI_CONNECTABLE); in set_connectable_update_settings()
2023 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_connectable_update_settings()
2026 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_update_settings()
2031 hci_update_page_scan(hdev); in set_connectable_update_settings()
2032 hci_update_background_scan(hdev); in set_connectable_update_settings()
2033 return new_settings(hdev, sk); in set_connectable_update_settings()
2039 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data, in set_connectable() argument
2048 BT_DBG("request for %s", hdev->name); in set_connectable()
2050 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in set_connectable()
2051 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_connectable()
2052 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
2056 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
2059 hci_dev_lock(hdev); in set_connectable()
2061 if (!hdev_is_powered(hdev)) { in set_connectable()
2062 err = set_connectable_update_settings(hdev, sk, cp->val); in set_connectable()
2066 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || in set_connectable()
2067 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { in set_connectable()
2068 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
2073 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len); in set_connectable()
2079 hci_req_init(&req, hdev); in set_connectable()
2085 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_connectable()
2087 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_connectable()
2088 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_connectable()
2091 } else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) { in set_connectable()
2101 if (list_empty(&hdev->whitelist)) in set_connectable()
2103 else if (test_bit(HCI_ISCAN, &hdev->flags)) in set_connectable()
2108 if (test_bit(HCI_ISCAN, &hdev->flags) && in set_connectable()
2109 hdev->discov_timeout > 0) in set_connectable()
2110 cancel_delayed_work(&hdev->discov_off); in set_connectable()
2118 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in set_connectable()
2119 hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in set_connectable()
2126 err = set_connectable_update_settings(hdev, sk, in set_connectable()
2132 hci_dev_unlock(hdev); in set_connectable()
2136 static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data, in set_bondable() argument
2143 BT_DBG("request for %s", hdev->name); in set_bondable()
2146 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE, in set_bondable()
2149 hci_dev_lock(hdev); in set_bondable()
2152 changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE); in set_bondable()
2154 changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE); in set_bondable()
2156 err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev); in set_bondable()
2161 err = new_settings(hdev, sk); in set_bondable()
2164 hci_dev_unlock(hdev); in set_bondable()
2168 static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data, in set_link_security() argument
2176 BT_DBG("request for %s", hdev->name); in set_link_security()
2178 status = mgmt_bredr_support(hdev); in set_link_security()
2180 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
2184 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
2187 hci_dev_lock(hdev); in set_link_security()
2189 if (!hdev_is_powered(hdev)) { in set_link_security()
2192 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { in set_link_security()
2193 hci_dev_change_flag(hdev, HCI_LINK_SECURITY); in set_link_security()
2197 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev); in set_link_security()
2202 err = new_settings(hdev, sk); in set_link_security()
2207 if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) { in set_link_security()
2208 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
2215 if (test_bit(HCI_AUTH, &hdev->flags) == val) { in set_link_security()
2216 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev); in set_link_security()
2220 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len); in set_link_security()
2226 err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val); in set_link_security()
2233 hci_dev_unlock(hdev); in set_link_security()
2237 static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_ssp() argument
2244 BT_DBG("request for %s", hdev->name); in set_ssp()
2246 status = mgmt_bredr_support(hdev); in set_ssp()
2248 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status); in set_ssp()
2250 if (!lmp_ssp_capable(hdev)) in set_ssp()
2251 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2255 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2258 hci_dev_lock(hdev); in set_ssp()
2260 if (!hdev_is_powered(hdev)) { in set_ssp()
2264 changed = !hci_dev_test_and_set_flag(hdev, in set_ssp()
2267 changed = hci_dev_test_and_clear_flag(hdev, in set_ssp()
2270 changed = hci_dev_test_and_clear_flag(hdev, in set_ssp()
2273 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in set_ssp()
2276 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev); in set_ssp()
2281 err = new_settings(hdev, sk); in set_ssp()
2286 if (pending_find(MGMT_OP_SET_SSP, hdev)) { in set_ssp()
2287 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2292 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_ssp()
2293 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev); in set_ssp()
2297 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len); in set_ssp()
2303 if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in set_ssp()
2304 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, in set_ssp()
2307 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val); in set_ssp()
2314 hci_dev_unlock(hdev); in set_ssp()
2318 static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_hs() argument
2325 BT_DBG("request for %s", hdev->name); in set_hs()
2327 status = mgmt_bredr_support(hdev); in set_hs()
2329 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status); in set_hs()
2331 if (!lmp_ssp_capable(hdev)) in set_hs()
2332 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2335 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in set_hs()
2336 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2340 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2343 hci_dev_lock(hdev); in set_hs()
2345 if (pending_find(MGMT_OP_SET_SSP, hdev)) { in set_hs()
2346 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2352 changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED); in set_hs()
2354 if (hdev_is_powered(hdev)) { in set_hs()
2355 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2360 changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED); in set_hs()
2363 err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev); in set_hs()
2368 err = new_settings(hdev, sk); in set_hs()
2371 hci_dev_unlock(hdev); in set_hs()
2375 static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in le_enable_complete() argument
2377 struct cmd_lookup match = { NULL, hdev }; in le_enable_complete()
2379 hci_dev_lock(hdev); in le_enable_complete()
2384 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp, in le_enable_complete()
2389 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match); in le_enable_complete()
2391 new_settings(hdev, match.sk); in le_enable_complete()
2401 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in le_enable_complete()
2404 hci_req_init(&req, hdev); in le_enable_complete()
2412 hci_dev_unlock(hdev); in le_enable_complete()
2415 static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_le() argument
2424 BT_DBG("request for %s", hdev->name); in set_le()
2426 if (!lmp_le_capable(hdev)) in set_le()
2427 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2431 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2443 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_le()
2445 return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev); in set_le()
2447 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2451 hci_dev_lock(hdev); in set_le()
2454 enabled = lmp_host_le_capable(hdev); in set_le()
2456 if (!hdev_is_powered(hdev) || val == enabled) { in set_le()
2459 if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in set_le()
2460 hci_dev_change_flag(hdev, HCI_LE_ENABLED); in set_le()
2464 if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in set_le()
2465 hci_dev_clear_flag(hdev, HCI_ADVERTISING); in set_le()
2469 err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev); in set_le()
2474 err = new_settings(hdev, sk); in set_le()
2479 if (pending_find(MGMT_OP_SET_LE, hdev) || in set_le()
2480 pending_find(MGMT_OP_SET_ADVERTISING, hdev)) { in set_le()
2481 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2486 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len); in set_le()
2492 hci_req_init(&req, hdev); in set_le()
2500 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_le()
2512 hci_dev_unlock(hdev); in set_le()
2522 static bool pending_eir_or_class(struct hci_dev *hdev) in pending_eir_or_class() argument
2526 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in pending_eir_or_class()
2558 static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status) in mgmt_class_complete() argument
2562 hci_dev_lock(hdev); in mgmt_class_complete()
2564 cmd = pending_find(mgmt_op, hdev); in mgmt_class_complete()
2569 mgmt_status(status), hdev->dev_class, 3); in mgmt_class_complete()
2574 hci_dev_unlock(hdev); in mgmt_class_complete()
2577 static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode) in add_uuid_complete() argument
2581 mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status); in add_uuid_complete()
2584 static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in add_uuid() argument
2592 BT_DBG("request for %s", hdev->name); in add_uuid()
2594 hci_dev_lock(hdev); in add_uuid()
2596 if (pending_eir_or_class(hdev)) { in add_uuid()
2597 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID, in add_uuid()
2612 list_add_tail(&uuid->list, &hdev->uuids); in add_uuid()
2614 hci_req_init(&req, hdev); in add_uuid()
2624 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0, in add_uuid()
2625 hdev->dev_class, 3); in add_uuid()
2629 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len); in add_uuid()
2638 hci_dev_unlock(hdev); in add_uuid()
2642 static bool enable_service_cache(struct hci_dev *hdev) in enable_service_cache() argument
2644 if (!hdev_is_powered(hdev)) in enable_service_cache()
2647 if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) { in enable_service_cache()
2648 queue_delayed_work(hdev->workqueue, &hdev->service_cache, in enable_service_cache()
2656 static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode) in remove_uuid_complete() argument
2660 mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status); in remove_uuid_complete()
2663 static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data, in remove_uuid() argument
2673 BT_DBG("request for %s", hdev->name); in remove_uuid()
2675 hci_dev_lock(hdev); in remove_uuid()
2677 if (pending_eir_or_class(hdev)) { in remove_uuid()
2678 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2684 hci_uuids_clear(hdev); in remove_uuid()
2686 if (enable_service_cache(hdev)) { in remove_uuid()
2687 err = mgmt_cmd_complete(sk, hdev->id, in remove_uuid()
2689 0, hdev->dev_class, 3); in remove_uuid()
2698 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) { in remove_uuid()
2708 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2714 hci_req_init(&req, hdev); in remove_uuid()
2724 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0, in remove_uuid()
2725 hdev->dev_class, 3); in remove_uuid()
2729 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len); in remove_uuid()
2738 hci_dev_unlock(hdev); in remove_uuid()
2742 static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_class_complete() argument
2746 mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status); in set_class_complete()
2749 static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data, in set_dev_class() argument
2757 BT_DBG("request for %s", hdev->name); in set_dev_class()
2759 if (!lmp_bredr_capable(hdev)) in set_dev_class()
2760 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2763 hci_dev_lock(hdev); in set_dev_class()
2765 if (pending_eir_or_class(hdev)) { in set_dev_class()
2766 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2772 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2777 hdev->major_class = cp->major; in set_dev_class()
2778 hdev->minor_class = cp->minor; in set_dev_class()
2780 if (!hdev_is_powered(hdev)) { in set_dev_class()
2781 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2782 hdev->dev_class, 3); in set_dev_class()
2786 hci_req_init(&req, hdev); in set_dev_class()
2788 if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) { in set_dev_class()
2789 hci_dev_unlock(hdev); in set_dev_class()
2790 cancel_delayed_work_sync(&hdev->service_cache); in set_dev_class()
2791 hci_dev_lock(hdev); in set_dev_class()
2802 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2803 hdev->dev_class, 3); in set_dev_class()
2807 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len); in set_dev_class()
2816 hci_dev_unlock(hdev); in set_dev_class()
2820 static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data, in load_link_keys() argument
2830 BT_DBG("request for %s", hdev->name); in load_link_keys()
2832 if (!lmp_bredr_capable(hdev)) in load_link_keys()
2833 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2840 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2849 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2854 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2857 BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys, in load_link_keys()
2864 return mgmt_cmd_status(sk, hdev->id, in load_link_keys()
2869 hci_dev_lock(hdev); in load_link_keys()
2871 hci_link_keys_clear(hdev); in load_link_keys()
2874 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS); in load_link_keys()
2876 changed = hci_dev_test_and_clear_flag(hdev, in load_link_keys()
2880 new_settings(hdev, NULL); in load_link_keys()
2891 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val, in load_link_keys()
2895 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0); in load_link_keys()
2897 hci_dev_unlock(hdev); in load_link_keys()
2902 static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr, in device_unpaired() argument
2910 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev), in device_unpaired()
2914 static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data, in unpair_device() argument
2929 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2934 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2938 hci_dev_lock(hdev); in unpair_device()
2940 if (!hdev_is_powered(hdev)) { in unpair_device()
2941 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2956 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in unpair_device()
2961 err = hci_remove_link_key(hdev, &cp->addr.bdaddr); in unpair_device()
2970 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, in unpair_device()
2986 hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2989 hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2991 err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2995 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
3005 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0, in unpair_device()
3007 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk); in unpair_device()
3011 cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp, in unpair_device()
3022 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc); in unpair_device()
3027 hci_dev_unlock(hdev); in unpair_device()
3031 static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data, in disconnect() argument
3047 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3051 hci_dev_lock(hdev); in disconnect()
3053 if (!test_bit(HCI_UP, &hdev->flags)) { in disconnect()
3054 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3060 if (pending_find(MGMT_OP_DISCONNECT, hdev)) { in disconnect()
3061 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3067 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in disconnect()
3070 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in disconnect()
3073 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3079 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len); in disconnect()
3092 hci_dev_unlock(hdev); in disconnect()
3115 static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, in get_connections() argument
3126 hci_dev_lock(hdev); in get_connections()
3128 if (!hdev_is_powered(hdev)) { in get_connections()
3129 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, in get_connections()
3135 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
3148 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
3163 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp, in get_connections()
3169 hci_dev_unlock(hdev); in get_connections()
3173 static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, in send_pin_code_neg_reply() argument
3179 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp, in send_pin_code_neg_reply()
3184 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, in send_pin_code_neg_reply()
3192 static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data, in pin_code_reply() argument
3203 hci_dev_lock(hdev); in pin_code_reply()
3205 if (!hdev_is_powered(hdev)) { in pin_code_reply()
3206 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3211 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in pin_code_reply()
3213 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3225 err = send_pin_code_neg_reply(sk, hdev, &ncp); in pin_code_reply()
3227 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3233 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len); in pin_code_reply()
3245 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply); in pin_code_reply()
3250 hci_dev_unlock(hdev); in pin_code_reply()
3254 static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data, in set_io_capability() argument
3262 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, in set_io_capability()
3265 hci_dev_lock(hdev); in set_io_capability()
3267 hdev->io_capability = cp->io_capability; in set_io_capability()
3269 BT_DBG("%s IO capability set to 0x%02x", hdev->name, in set_io_capability()
3270 hdev->io_capability); in set_io_capability()
3272 hci_dev_unlock(hdev); in set_io_capability()
3274 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, in set_io_capability()
3280 struct hci_dev *hdev = conn->hdev; in find_pairing() local
3283 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in find_pairing()
3372 static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data, in pair_device() argument
3389 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3394 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3398 hci_dev_lock(hdev); in pair_device()
3400 if (!hdev_is_powered(hdev)) { in pair_device()
3401 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3407 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) { in pair_device()
3408 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3418 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level, in pair_device()
3439 hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type); in pair_device()
3441 conn = hci_connect_le(hdev, &cp->addr.bdaddr, addr_type, in pair_device()
3458 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3465 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3470 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len); in pair_device()
3502 hci_dev_unlock(hdev); in pair_device()
3506 static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data, in cancel_pair_device() argument
3516 hci_dev_lock(hdev); in cancel_pair_device()
3518 if (!hdev_is_powered(hdev)) { in cancel_pair_device()
3519 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3524 cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev); in cancel_pair_device()
3526 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3534 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3542 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0, in cancel_pair_device()
3545 hci_dev_unlock(hdev); in cancel_pair_device()
3549 static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev, in user_pairing_resp() argument
3557 hci_dev_lock(hdev); in user_pairing_resp()
3559 if (!hdev_is_powered(hdev)) { in user_pairing_resp()
3560 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3567 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr); in user_pairing_resp()
3569 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr); in user_pairing_resp()
3572 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3581 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3585 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3592 cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr)); in user_pairing_resp()
3606 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp); in user_pairing_resp()
3608 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr), in user_pairing_resp()
3615 hci_dev_unlock(hdev); in user_pairing_resp()
3619 static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, in pin_code_neg_reply() argument
3626 return user_pairing_resp(sk, hdev, &cp->addr, in pin_code_neg_reply()
3631 static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data, in user_confirm_reply() argument
3639 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY, in user_confirm_reply()
3642 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_reply()
3647 static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev, in user_confirm_neg_reply() argument
3654 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_neg_reply()
3659 static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data, in user_passkey_reply() argument
3666 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_reply()
3671 static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev, in user_passkey_neg_reply() argument
3678 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_neg_reply()
3685 struct hci_dev *hdev = req->hdev; in update_name() local
3688 memcpy(cp.name, hdev->dev_name, sizeof(cp.name)); in update_name()
3693 static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_name_complete() argument
3700 hci_dev_lock(hdev); in set_name_complete()
3702 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); in set_name_complete()
3709 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_name_complete()
3712 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_name_complete()
3718 hci_dev_unlock(hdev); in set_name_complete()
3721 static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data, in set_local_name() argument
3731 hci_dev_lock(hdev); in set_local_name()
3736 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) && in set_local_name()
3737 !memcmp(hdev->short_name, cp->short_name, in set_local_name()
3738 sizeof(hdev->short_name))) { in set_local_name()
3739 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3744 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name)); in set_local_name()
3746 if (!hdev_is_powered(hdev)) { in set_local_name()
3747 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3749 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3754 err = mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, in set_local_name()
3760 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len); in set_local_name()
3766 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3768 hci_req_init(&req, hdev); in set_local_name()
3770 if (lmp_bredr_capable(hdev)) { in set_local_name()
3778 if (lmp_le_capable(hdev)) in set_local_name()
3786 hci_dev_unlock(hdev); in set_local_name()
3790 static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status, in read_local_oob_data_complete() argument
3797 BT_DBG("%s status %u", hdev->name, status); in read_local_oob_data_complete()
3799 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev); in read_local_oob_data_complete()
3804 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
3815 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
3829 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
3842 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
3849 static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev, in read_local_oob_data() argument
3856 BT_DBG("%s", hdev->name); in read_local_oob_data()
3858 hci_dev_lock(hdev); in read_local_oob_data()
3860 if (!hdev_is_powered(hdev)) { in read_local_oob_data()
3861 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3866 if (!lmp_ssp_capable(hdev)) { in read_local_oob_data()
3867 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3872 if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) { in read_local_oob_data()
3873 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3878 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0); in read_local_oob_data()
3884 hci_req_init(&req, hdev); in read_local_oob_data()
3886 if (bredr_sc_enabled(hdev)) in read_local_oob_data()
3896 hci_dev_unlock(hdev); in read_local_oob_data()
3900 static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev, in add_remote_oob_data() argument
3906 BT_DBG("%s ", hdev->name); in add_remote_oob_data()
3909 return mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3914 hci_dev_lock(hdev); in add_remote_oob_data()
3921 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3928 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
3936 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3950 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3985 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
3993 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3998 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, in add_remote_oob_data()
4003 hci_dev_unlock(hdev); in add_remote_oob_data()
4007 static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev, in remove_remote_oob_data() argument
4014 BT_DBG("%s", hdev->name); in remove_remote_oob_data()
4017 return mgmt_cmd_complete(sk, hdev->id, in remove_remote_oob_data()
4022 hci_dev_lock(hdev); in remove_remote_oob_data()
4025 hci_remote_oob_data_clear(hdev); in remove_remote_oob_data()
4030 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type); in remove_remote_oob_data()
4037 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA, in remove_remote_oob_data()
4040 hci_dev_unlock(hdev); in remove_remote_oob_data()
4046 struct hci_dev *hdev = req->hdev; in trigger_bredr_inquiry() local
4051 *status = mgmt_bredr_support(hdev); in trigger_bredr_inquiry()
4055 if (hci_dev_test_flag(hdev, HCI_INQUIRY)) { in trigger_bredr_inquiry()
4060 hci_inquiry_cache_flush(hdev); in trigger_bredr_inquiry()
4073 struct hci_dev *hdev = req->hdev; in trigger_le_scan() local
4079 *status = mgmt_le_support(hdev); in trigger_le_scan()
4083 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) { in trigger_le_scan()
4087 if (hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) { in trigger_le_scan()
4099 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) in trigger_le_scan()
4133 struct hci_dev *hdev = req->hdev; in trigger_discovery() local
4135 switch (hdev->discovery.type) { in trigger_discovery()
4143 &hdev->quirks)) { in trigger_discovery()
4158 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in trigger_discovery()
4177 static void start_discovery_complete(struct hci_dev *hdev, u8 status, in start_discovery_complete() argument
4185 hci_dev_lock(hdev); in start_discovery_complete()
4187 cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev); in start_discovery_complete()
4189 cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev); in start_discovery_complete()
4197 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); in start_discovery_complete()
4201 hci_discovery_set_state(hdev, DISCOVERY_FINDING); in start_discovery_complete()
4206 switch (hdev->discovery.type) { in start_discovery_complete()
4219 if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks)) in start_discovery_complete()
4222 timeout = msecs_to_jiffies(hdev->discov_interleaved_timeout); in start_discovery_complete()
4228 BT_ERR("Invalid discovery type %d", hdev->discovery.type); in start_discovery_complete()
4240 &hdev->quirks) && in start_discovery_complete()
4241 hdev->discovery.result_filtering) { in start_discovery_complete()
4242 hdev->discovery.scan_start = jiffies; in start_discovery_complete()
4243 hdev->discovery.scan_duration = timeout; in start_discovery_complete()
4246 queue_delayed_work(hdev->workqueue, in start_discovery_complete()
4247 &hdev->le_scan_disable, timeout); in start_discovery_complete()
4251 hci_dev_unlock(hdev); in start_discovery_complete()
4254 static int start_discovery(struct sock *sk, struct hci_dev *hdev, in start_discovery() argument
4263 BT_DBG("%s", hdev->name); in start_discovery()
4265 hci_dev_lock(hdev); in start_discovery()
4267 if (!hdev_is_powered(hdev)) { in start_discovery()
4268 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY, in start_discovery()
4274 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_discovery()
4275 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) { in start_discovery()
4276 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY, in start_discovery()
4282 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, data, len); in start_discovery()
4293 hci_discovery_filter_clear(hdev); in start_discovery()
4295 hdev->discovery.type = cp->type; in start_discovery()
4296 hdev->discovery.report_invalid_rssi = false; in start_discovery()
4298 hci_req_init(&req, hdev); in start_discovery()
4301 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY, in start_discovery()
4313 hci_discovery_set_state(hdev, DISCOVERY_STARTING); in start_discovery()
4316 hci_dev_unlock(hdev); in start_discovery()
4327 static int start_service_discovery(struct sock *sk, struct hci_dev *hdev, in start_service_discovery() argument
4338 BT_DBG("%s", hdev->name); in start_service_discovery()
4340 hci_dev_lock(hdev); in start_service_discovery()
4342 if (!hdev_is_powered(hdev)) { in start_service_discovery()
4343 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4350 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_service_discovery()
4351 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) { in start_service_discovery()
4352 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4363 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4374 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4382 hdev, data, len); in start_service_discovery()
4393 hci_discovery_filter_clear(hdev); in start_service_discovery()
4395 hdev->discovery.result_filtering = true; in start_service_discovery()
4396 hdev->discovery.type = cp->type; in start_service_discovery()
4397 hdev->discovery.rssi = cp->rssi; in start_service_discovery()
4398 hdev->discovery.uuid_count = uuid_count; in start_service_discovery()
4401 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16, in start_service_discovery()
4403 if (!hdev->discovery.uuids) { in start_service_discovery()
4404 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4413 hci_req_init(&req, hdev); in start_service_discovery()
4416 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4429 hci_discovery_set_state(hdev, DISCOVERY_STARTING); in start_service_discovery()
4432 hci_dev_unlock(hdev); in start_service_discovery()
4436 static void stop_discovery_complete(struct hci_dev *hdev, u8 status, u16 opcode) in stop_discovery_complete() argument
4442 hci_dev_lock(hdev); in stop_discovery_complete()
4444 cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev); in stop_discovery_complete()
4451 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); in stop_discovery_complete()
4453 hci_dev_unlock(hdev); in stop_discovery_complete()
4456 static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data, in stop_discovery() argument
4464 BT_DBG("%s", hdev->name); in stop_discovery()
4466 hci_dev_lock(hdev); in stop_discovery()
4468 if (!hci_discovery_active(hdev)) { in stop_discovery()
4469 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
4475 if (hdev->discovery.type != mgmt_cp->type) { in stop_discovery()
4476 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
4482 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len); in stop_discovery()
4490 hci_req_init(&req, hdev); in stop_discovery()
4496 hci_discovery_set_state(hdev, DISCOVERY_STOPPING); in stop_discovery()
4504 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0, in stop_discovery()
4506 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); in stop_discovery()
4510 hci_dev_unlock(hdev); in stop_discovery()
4514 static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data, in confirm_name() argument
4521 BT_DBG("%s", hdev->name); in confirm_name()
4523 hci_dev_lock(hdev); in confirm_name()
4525 if (!hci_discovery_active(hdev)) { in confirm_name()
4526 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
4532 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr); in confirm_name()
4534 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
4545 hci_inquiry_cache_update_resolve(hdev, e); in confirm_name()
4548 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, in confirm_name()
4552 hci_dev_unlock(hdev); in confirm_name()
4556 static int block_device(struct sock *sk, struct hci_dev *hdev, void *data, in block_device() argument
4563 BT_DBG("%s", hdev->name); in block_device()
4566 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, in block_device()
4570 hci_dev_lock(hdev); in block_device()
4572 err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr, in block_device()
4579 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr), in block_device()
4584 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status, in block_device()
4587 hci_dev_unlock(hdev); in block_device()
4592 static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data, in unblock_device() argument
4599 BT_DBG("%s", hdev->name); in unblock_device()
4602 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, in unblock_device()
4606 hci_dev_lock(hdev); in unblock_device()
4608 err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr, in unblock_device()
4615 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr), in unblock_device()
4620 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status, in unblock_device()
4623 hci_dev_unlock(hdev); in unblock_device()
4628 static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data, in set_device_id() argument
4636 BT_DBG("%s", hdev->name); in set_device_id()
4641 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, in set_device_id()
4644 hci_dev_lock(hdev); in set_device_id()
4646 hdev->devid_source = source; in set_device_id()
4647 hdev->devid_vendor = __le16_to_cpu(cp->vendor); in set_device_id()
4648 hdev->devid_product = __le16_to_cpu(cp->product); in set_device_id()
4649 hdev->devid_version = __le16_to_cpu(cp->version); in set_device_id()
4651 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, in set_device_id()
4654 hci_req_init(&req, hdev); in set_device_id()
4658 hci_dev_unlock(hdev); in set_device_id()
4663 static void enable_advertising_instance(struct hci_dev *hdev, u8 status, in enable_advertising_instance() argument
4669 static void set_advertising_complete(struct hci_dev *hdev, u8 status, in set_advertising_complete() argument
4672 struct cmd_lookup match = { NULL, hdev }; in set_advertising_complete()
4675 hci_dev_lock(hdev); in set_advertising_complete()
4680 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, in set_advertising_complete()
4685 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_advertising_complete()
4686 hci_dev_set_flag(hdev, HCI_ADVERTISING); in set_advertising_complete()
4688 hci_dev_clear_flag(hdev, HCI_ADVERTISING); in set_advertising_complete()
4690 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp, in set_advertising_complete()
4693 new_settings(hdev, match.sk); in set_advertising_complete()
4701 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in set_advertising_complete()
4702 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in set_advertising_complete()
4705 hci_req_init(&req, hdev); in set_advertising_complete()
4714 hci_dev_unlock(hdev); in set_advertising_complete()
4717 static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data, in set_advertising() argument
4726 BT_DBG("request for %s", hdev->name); in set_advertising()
4728 status = mgmt_le_support(hdev); in set_advertising()
4730 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4734 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4737 hci_dev_lock(hdev); in set_advertising()
4746 if (!hdev_is_powered(hdev) || in set_advertising()
4747 (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) && in set_advertising()
4748 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) || in set_advertising()
4749 hci_conn_num(hdev, LE_LINK) > 0 || in set_advertising()
4750 (hci_dev_test_flag(hdev, HCI_LE_SCAN) && in set_advertising()
4751 hdev->le_scan_type == LE_SCAN_ACTIVE)) { in set_advertising()
4755 changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING); in set_advertising()
4757 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4759 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4761 changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING); in set_advertising()
4762 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4765 err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev); in set_advertising()
4770 err = new_settings(hdev, sk); in set_advertising()
4775 if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) || in set_advertising()
4776 pending_find(MGMT_OP_SET_LE, hdev)) { in set_advertising()
4777 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4782 cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len); in set_advertising()
4788 hci_req_init(&req, hdev); in set_advertising()
4791 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4793 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4809 hci_dev_unlock(hdev); in set_advertising()
4813 static int set_static_address(struct sock *sk, struct hci_dev *hdev, in set_static_address() argument
4819 BT_DBG("%s", hdev->name); in set_static_address()
4821 if (!lmp_le_capable(hdev)) in set_static_address()
4822 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
4825 if (hdev_is_powered(hdev)) in set_static_address()
4826 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
4831 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
4837 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
4842 hci_dev_lock(hdev); in set_static_address()
4844 bacpy(&hdev->static_addr, &cp->bdaddr); in set_static_address()
4846 err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev); in set_static_address()
4850 err = new_settings(hdev, sk); in set_static_address()
4853 hci_dev_unlock(hdev); in set_static_address()
4857 static int set_scan_params(struct sock *sk, struct hci_dev *hdev, in set_scan_params() argument
4864 BT_DBG("%s", hdev->name); in set_scan_params()
4866 if (!lmp_le_capable(hdev)) in set_scan_params()
4867 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4873 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4879 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4883 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4886 hci_dev_lock(hdev); in set_scan_params()
4888 hdev->le_scan_interval = interval; in set_scan_params()
4889 hdev->le_scan_window = window; in set_scan_params()
4891 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, in set_scan_params()
4897 if (hci_dev_test_flag(hdev, HCI_LE_SCAN) && in set_scan_params()
4898 hdev->discovery.state == DISCOVERY_STOPPED) { in set_scan_params()
4901 hci_req_init(&req, hdev); in set_scan_params()
4909 hci_dev_unlock(hdev); in set_scan_params()
4914 static void fast_connectable_complete(struct hci_dev *hdev, u8 status, in fast_connectable_complete() argument
4921 hci_dev_lock(hdev); in fast_connectable_complete()
4923 cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
4928 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in fast_connectable_complete()
4934 hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE); in fast_connectable_complete()
4936 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE); in fast_connectable_complete()
4938 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
4939 new_settings(hdev, cmd->sk); in fast_connectable_complete()
4945 hci_dev_unlock(hdev); in fast_connectable_complete()
4948 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, in set_fast_connectable() argument
4956 BT_DBG("%s", hdev->name); in set_fast_connectable()
4958 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) || in set_fast_connectable()
4959 hdev->hci_ver < BLUETOOTH_VER_1_2) in set_fast_connectable()
4960 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4964 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4967 hci_dev_lock(hdev); in set_fast_connectable()
4969 if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) { in set_fast_connectable()
4970 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4975 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) { in set_fast_connectable()
4977 hdev); in set_fast_connectable()
4981 if (!hdev_is_powered(hdev)) { in set_fast_connectable()
4982 hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE); in set_fast_connectable()
4984 hdev); in set_fast_connectable()
4985 new_settings(hdev, sk); in set_fast_connectable()
4989 cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev, in set_fast_connectable()
4996 hci_req_init(&req, hdev); in set_fast_connectable()
5002 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5008 hci_dev_unlock(hdev); in set_fast_connectable()
5013 static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_bredr_complete() argument
5019 hci_dev_lock(hdev); in set_bredr_complete()
5021 cmd = pending_find(MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
5031 hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); in set_bredr_complete()
5035 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
5036 new_settings(hdev, cmd->sk); in set_bredr_complete()
5042 hci_dev_unlock(hdev); in set_bredr_complete()
5045 static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_bredr() argument
5052 BT_DBG("request for %s", hdev->name); in set_bredr()
5054 if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev)) in set_bredr()
5055 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5058 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in set_bredr()
5059 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5063 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5066 hci_dev_lock(hdev); in set_bredr()
5068 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_bredr()
5069 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev); in set_bredr()
5073 if (!hdev_is_powered(hdev)) { in set_bredr()
5075 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_bredr()
5076 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED); in set_bredr()
5077 hci_dev_clear_flag(hdev, HCI_LINK_SECURITY); in set_bredr()
5078 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE); in set_bredr()
5079 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in set_bredr()
5082 hci_dev_change_flag(hdev, HCI_BREDR_ENABLED); in set_bredr()
5084 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev); in set_bredr()
5088 err = new_settings(hdev, sk); in set_bredr()
5094 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5112 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in set_bredr()
5113 (bacmp(&hdev->static_addr, BDADDR_ANY) || in set_bredr()
5114 hci_dev_test_flag(hdev, HCI_SC_ENABLED))) { in set_bredr()
5115 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5121 if (pending_find(MGMT_OP_SET_BREDR, hdev)) { in set_bredr()
5122 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5127 cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len); in set_bredr()
5136 hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); in set_bredr()
5138 hci_req_init(&req, hdev); in set_bredr()
5153 hci_dev_unlock(hdev); in set_bredr()
5157 static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in sc_enable_complete() argument
5162 BT_DBG("%s status %u", hdev->name, status); in sc_enable_complete()
5164 hci_dev_lock(hdev); in sc_enable_complete()
5166 cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
5180 hci_dev_clear_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
5181 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
5184 hci_dev_set_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
5185 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
5188 hci_dev_set_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
5189 hci_dev_set_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
5193 send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
5194 new_settings(hdev, cmd->sk); in sc_enable_complete()
5199 hci_dev_unlock(hdev); in sc_enable_complete()
5202 static int set_secure_conn(struct sock *sk, struct hci_dev *hdev, in set_secure_conn() argument
5211 BT_DBG("request for %s", hdev->name); in set_secure_conn()
5213 if (!lmp_sc_capable(hdev) && in set_secure_conn()
5214 !hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in set_secure_conn()
5215 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5218 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in set_secure_conn()
5219 lmp_sc_capable(hdev) && in set_secure_conn()
5220 !hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in set_secure_conn()
5221 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5225 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5228 hci_dev_lock(hdev); in set_secure_conn()
5230 if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) || in set_secure_conn()
5231 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_secure_conn()
5235 changed = !hci_dev_test_and_set_flag(hdev, in set_secure_conn()
5238 hci_dev_set_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
5240 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
5242 changed = hci_dev_test_and_clear_flag(hdev, in set_secure_conn()
5244 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
5247 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev); in set_secure_conn()
5252 err = new_settings(hdev, sk); in set_secure_conn()
5257 if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) { in set_secure_conn()
5258 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5265 if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) && in set_secure_conn()
5266 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in set_secure_conn()
5267 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev); in set_secure_conn()
5271 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SECURE_CONN, hdev, data, len); in set_secure_conn()
5277 hci_req_init(&req, hdev); in set_secure_conn()
5286 hci_dev_unlock(hdev); in set_secure_conn()
5290 static int set_debug_keys(struct sock *sk, struct hci_dev *hdev, in set_debug_keys() argument
5297 BT_DBG("request for %s", hdev->name); in set_debug_keys()
5300 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS, in set_debug_keys()
5303 hci_dev_lock(hdev); in set_debug_keys()
5306 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS); in set_debug_keys()
5308 changed = hci_dev_test_and_clear_flag(hdev, in set_debug_keys()
5312 use_changed = !hci_dev_test_and_set_flag(hdev, in set_debug_keys()
5315 use_changed = hci_dev_test_and_clear_flag(hdev, in set_debug_keys()
5318 if (hdev_is_powered(hdev) && use_changed && in set_debug_keys()
5319 hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_debug_keys()
5321 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, in set_debug_keys()
5325 err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev); in set_debug_keys()
5330 err = new_settings(hdev, sk); in set_debug_keys()
5333 hci_dev_unlock(hdev); in set_debug_keys()
5337 static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data, in set_privacy() argument
5344 BT_DBG("request for %s", hdev->name); in set_privacy()
5346 if (!lmp_le_capable(hdev)) in set_privacy()
5347 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5351 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5354 if (hdev_is_powered(hdev)) in set_privacy()
5355 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5358 hci_dev_lock(hdev); in set_privacy()
5363 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING); in set_privacy()
5366 changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY); in set_privacy()
5367 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk)); in set_privacy()
5368 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); in set_privacy()
5370 changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY); in set_privacy()
5371 memset(hdev->irk, 0, sizeof(hdev->irk)); in set_privacy()
5372 hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED); in set_privacy()
5375 err = send_settings_rsp(sk, MGMT_OP_SET_PRIVACY, hdev); in set_privacy()
5380 err = new_settings(hdev, sk); in set_privacy()
5383 hci_dev_unlock(hdev); in set_privacy()
5403 static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data, in load_irks() argument
5412 BT_DBG("request for %s", hdev->name); in load_irks()
5414 if (!lmp_le_capable(hdev)) in load_irks()
5415 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5421 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5429 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5433 BT_DBG("%s irk_count %u", hdev->name, irk_count); in load_irks()
5439 return mgmt_cmd_status(sk, hdev->id, in load_irks()
5444 hci_dev_lock(hdev); in load_irks()
5446 hci_smp_irks_clear(hdev); in load_irks()
5457 hci_add_irk(hdev, &irk->addr.bdaddr, addr_type, irk->val, in load_irks()
5461 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING); in load_irks()
5463 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0); in load_irks()
5465 hci_dev_unlock(hdev); in load_irks()
5489 static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev, in load_long_term_keys() argument
5498 BT_DBG("request for %s", hdev->name); in load_long_term_keys()
5500 if (!lmp_le_capable(hdev)) in load_long_term_keys()
5501 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5507 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5516 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5520 BT_DBG("%s key_count %u", hdev->name, key_count); in load_long_term_keys()
5526 return mgmt_cmd_status(sk, hdev->id, in load_long_term_keys()
5531 hci_dev_lock(hdev); in load_long_term_keys()
5533 hci_smp_ltks_clear(hdev); in load_long_term_keys()
5568 hci_add_ltk(hdev, &key->addr.bdaddr, addr_type, type, in load_long_term_keys()
5573 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0, in load_long_term_keys()
5576 hci_dev_unlock(hdev); in load_long_term_keys()
5608 static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status, in conn_info_refresh_complete() argument
5619 hci_dev_lock(hdev); in conn_info_refresh_complete()
5630 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI); in conn_info_refresh_complete()
5632 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER); in conn_info_refresh_complete()
5644 conn = hci_conn_hash_lookup_handle(hdev, handle); in conn_info_refresh_complete()
5650 cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn); in conn_info_refresh_complete()
5658 hci_dev_unlock(hdev); in conn_info_refresh_complete()
5661 static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data, in get_conn_info() argument
5670 BT_DBG("%s", hdev->name); in get_conn_info()
5677 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5681 hci_dev_lock(hdev); in get_conn_info()
5683 if (!hdev_is_powered(hdev)) { in get_conn_info()
5684 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5691 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in get_conn_info()
5694 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info()
5697 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5703 if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) { in get_conn_info()
5704 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5712 conn_info_age = hdev->conn_info_min_age + in get_conn_info()
5713 prandom_u32_max(hdev->conn_info_max_age - in get_conn_info()
5714 hdev->conn_info_min_age); in get_conn_info()
5727 hci_req_init(&req, hdev); in get_conn_info()
5755 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CONN_INFO, hdev, in get_conn_info()
5773 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5778 hci_dev_unlock(hdev); in get_conn_info()
5786 struct hci_dev *hdev; in clock_info_cmd_complete() local
5795 hdev = hci_dev_get(cmd->index); in clock_info_cmd_complete()
5796 if (hdev) { in clock_info_cmd_complete()
5797 rp.local_clock = cpu_to_le32(hdev->clock); in clock_info_cmd_complete()
5798 hci_dev_put(hdev); in clock_info_cmd_complete()
5818 static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode) in get_clock_info_complete() argument
5824 BT_DBG("%s status %u", hdev->name, status); in get_clock_info_complete()
5826 hci_dev_lock(hdev); in get_clock_info_complete()
5828 hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK); in get_clock_info_complete()
5834 conn = hci_conn_hash_lookup_handle(hdev, handle); in get_clock_info_complete()
5839 cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn); in get_clock_info_complete()
5847 hci_dev_unlock(hdev); in get_clock_info_complete()
5850 static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data, in get_clock_info() argument
5861 BT_DBG("%s", hdev->name); in get_clock_info()
5868 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
5872 hci_dev_lock(hdev); in get_clock_info()
5874 if (!hdev_is_powered(hdev)) { in get_clock_info()
5875 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
5882 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in get_clock_info()
5885 err = mgmt_cmd_complete(sk, hdev->id, in get_clock_info()
5895 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CLOCK_INFO, hdev, data, len); in get_clock_info()
5903 hci_req_init(&req, hdev); in get_clock_info()
5922 hci_dev_unlock(hdev); in get_clock_info()
5926 static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type) in is_connected() argument
5930 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr); in is_connected()
5947 struct hci_dev *hdev = req->hdev; in hci_conn_params_set() local
5950 params = hci_conn_params_add(hdev, addr, addr_type); in hci_conn_params_set()
5965 list_add(¶ms->action, &hdev->pend_le_reports); in hci_conn_params_set()
5970 if (!is_connected(hdev, addr, addr_type)) { in hci_conn_params_set()
5971 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
5985 static void device_added(struct sock *sk, struct hci_dev *hdev, in device_added() argument
5994 mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk); in device_added()
5997 static void add_device_complete(struct hci_dev *hdev, u8 status, u16 opcode) in add_device_complete() argument
6003 hci_dev_lock(hdev); in add_device_complete()
6005 cmd = pending_find(MGMT_OP_ADD_DEVICE, hdev); in add_device_complete()
6013 hci_dev_unlock(hdev); in add_device_complete()
6016 static int add_device(struct sock *sk, struct hci_dev *hdev, in add_device() argument
6025 BT_DBG("%s", hdev->name); in add_device()
6029 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6034 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6038 hci_req_init(&req, hdev); in add_device()
6040 hci_dev_lock(hdev); in add_device()
6042 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_DEVICE, hdev, data, len); in add_device()
6059 err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr, in add_device()
6092 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action); in add_device()
6105 hci_dev_unlock(hdev); in add_device()
6109 static void device_removed(struct sock *sk, struct hci_dev *hdev, in device_removed() argument
6117 mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk); in device_removed()
6120 static void remove_device_complete(struct hci_dev *hdev, u8 status, u16 opcode) in remove_device_complete() argument
6126 hci_dev_lock(hdev); in remove_device_complete()
6128 cmd = pending_find(MGMT_OP_REMOVE_DEVICE, hdev); in remove_device_complete()
6136 hci_dev_unlock(hdev); in remove_device_complete()
6139 static int remove_device(struct sock *sk, struct hci_dev *hdev, in remove_device() argument
6147 BT_DBG("%s", hdev->name); in remove_device()
6149 hci_req_init(&req, hdev); in remove_device()
6151 hci_dev_lock(hdev); in remove_device()
6153 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_DEVICE, hdev, data, len); in remove_device()
6173 err = hci_bdaddr_list_del(&hdev->whitelist, in remove_device()
6185 device_removed(sk, hdev, &cp->addr.bdaddr, in remove_device()
6195 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in remove_device()
6216 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); in remove_device()
6228 list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) { in remove_device()
6229 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); in remove_device()
6236 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) { in remove_device()
6239 device_removed(sk, hdev, &p->addr, p->addr_type); in remove_device()
6262 hci_dev_unlock(hdev); in remove_device()
6266 static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data, in load_conn_param() argument
6275 if (!lmp_le_capable(hdev)) in load_conn_param()
6276 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6283 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6292 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6296 BT_DBG("%s param_count %u", hdev->name, param_count); in load_conn_param()
6298 hci_dev_lock(hdev); in load_conn_param()
6300 hci_conn_params_clear_disabled(hdev); in load_conn_param()
6333 hci_param = hci_conn_params_add(hdev, ¶m->addr.bdaddr, in load_conn_param()
6346 hci_dev_unlock(hdev); in load_conn_param()
6348 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0, in load_conn_param()
6352 static int set_external_config(struct sock *sk, struct hci_dev *hdev, in set_external_config() argument
6359 BT_DBG("%s", hdev->name); in set_external_config()
6361 if (hdev_is_powered(hdev)) in set_external_config()
6362 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6366 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6369 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in set_external_config()
6370 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6373 hci_dev_lock(hdev); in set_external_config()
6376 changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED); in set_external_config()
6378 changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED); in set_external_config()
6380 err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev); in set_external_config()
6387 err = new_options(hdev, sk); in set_external_config()
6389 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) { in set_external_config()
6390 mgmt_index_removed(hdev); in set_external_config()
6392 if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) { in set_external_config()
6393 hci_dev_set_flag(hdev, HCI_CONFIG); in set_external_config()
6394 hci_dev_set_flag(hdev, HCI_AUTO_OFF); in set_external_config()
6396 queue_work(hdev->req_workqueue, &hdev->power_on); in set_external_config()
6398 set_bit(HCI_RAW, &hdev->flags); in set_external_config()
6399 mgmt_index_added(hdev); in set_external_config()
6404 hci_dev_unlock(hdev); in set_external_config()
6408 static int set_public_address(struct sock *sk, struct hci_dev *hdev, in set_public_address() argument
6415 BT_DBG("%s", hdev->name); in set_public_address()
6417 if (hdev_is_powered(hdev)) in set_public_address()
6418 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6422 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6425 if (!hdev->set_bdaddr) in set_public_address()
6426 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6429 hci_dev_lock(hdev); in set_public_address()
6431 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr); in set_public_address()
6432 bacpy(&hdev->public_addr, &cp->bdaddr); in set_public_address()
6434 err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev); in set_public_address()
6441 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) in set_public_address()
6442 err = new_options(hdev, sk); in set_public_address()
6444 if (is_configured(hdev)) { in set_public_address()
6445 mgmt_index_removed(hdev); in set_public_address()
6447 hci_dev_clear_flag(hdev, HCI_UNCONFIGURED); in set_public_address()
6449 hci_dev_set_flag(hdev, HCI_CONFIG); in set_public_address()
6450 hci_dev_set_flag(hdev, HCI_AUTO_OFF); in set_public_address()
6452 queue_work(hdev->req_workqueue, &hdev->power_on); in set_public_address()
6456 hci_dev_unlock(hdev); in set_public_address()
6471 static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status, in read_local_oob_ext_data_complete() argument
6481 BT_DBG("%s status %u", hdev->name, status); in read_local_oob_ext_data_complete()
6483 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev); in read_local_oob_ext_data_complete()
6523 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in read_local_oob_ext_data_complete()
6546 hdev->dev_class, 3); in read_local_oob_ext_data_complete()
6566 err = mgmt_cmd_complete(cmd->sk, hdev->id, in read_local_oob_ext_data_complete()
6574 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev, in read_local_oob_ext_data_complete()
6582 static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk, in read_local_ssp_oob_req() argument
6589 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev, in read_local_ssp_oob_req()
6594 hci_req_init(&req, hdev); in read_local_ssp_oob_req()
6596 if (bredr_sc_enabled(hdev)) in read_local_ssp_oob_req()
6610 static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, in read_local_oob_ext_data() argument
6620 BT_DBG("%s", hdev->name); in read_local_oob_ext_data()
6622 if (hdev_is_powered(hdev)) { in read_local_oob_ext_data()
6625 status = mgmt_bredr_support(hdev); in read_local_oob_ext_data()
6632 status = mgmt_le_support(hdev); in read_local_oob_ext_data()
6656 hci_dev_lock(hdev); in read_local_oob_ext_data()
6661 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in read_local_oob_ext_data()
6662 err = read_local_ssp_oob_req(hdev, sk, cp); in read_local_oob_ext_data()
6663 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6672 hdev->dev_class, 3); in read_local_oob_ext_data()
6676 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) && in read_local_oob_ext_data()
6677 smp_generate_oob(hdev, hash, rand) < 0) { in read_local_oob_ext_data()
6678 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6693 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) { in read_local_oob_ext_data()
6694 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6699 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || in read_local_oob_ext_data()
6700 !bacmp(&hdev->bdaddr, BDADDR_ANY) || in read_local_oob_ext_data()
6701 (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in read_local_oob_ext_data()
6702 bacmp(&hdev->static_addr, BDADDR_ANY))) { in read_local_oob_ext_data()
6703 memcpy(addr, &hdev->static_addr, 6); in read_local_oob_ext_data()
6706 memcpy(addr, &hdev->bdaddr, 6); in read_local_oob_ext_data()
6713 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in read_local_oob_ext_data()
6721 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) { in read_local_oob_ext_data()
6731 flags = get_adv_discov_flags(hdev); in read_local_oob_ext_data()
6733 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in read_local_oob_ext_data()
6741 hci_dev_unlock(hdev); in read_local_oob_ext_data()
6751 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, in read_local_oob_ext_data()
6756 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev, in read_local_oob_ext_data()
6766 static u32 get_supported_adv_flags(struct hci_dev *hdev) in get_supported_adv_flags() argument
6775 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) in get_supported_adv_flags()
6781 static int read_adv_features(struct sock *sk, struct hci_dev *hdev, in read_adv_features() argument
6790 BT_DBG("%s", hdev->name); in read_adv_features()
6792 if (!lmp_le_capable(hdev)) in read_adv_features()
6793 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
6796 hci_dev_lock(hdev); in read_adv_features()
6803 instance = hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE); in read_adv_features()
6809 hci_dev_unlock(hdev); in read_adv_features()
6813 supported_flags = get_supported_adv_flags(hdev); in read_adv_features()
6830 hci_dev_unlock(hdev); in read_adv_features()
6832 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
6840 static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data, in tlv_data_is_valid() argument
6883 static void add_advertising_complete(struct hci_dev *hdev, u8 status, in add_advertising_complete() argument
6891 hci_dev_lock(hdev); in add_advertising_complete()
6893 cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev); in add_advertising_complete()
6896 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE); in add_advertising_complete()
6897 memset(&hdev->adv_instance, 0, sizeof(hdev->adv_instance)); in add_advertising_complete()
6898 advertising_removed(cmd ? cmd->sk : NULL, hdev, 1); in add_advertising_complete()
6916 hci_dev_unlock(hdev); in add_advertising_complete()
6921 struct hci_dev *hdev = container_of(work, struct hci_dev, in adv_timeout_expired() local
6924 hdev->adv_instance.timeout = 0; in adv_timeout_expired()
6926 hci_dev_lock(hdev); in adv_timeout_expired()
6927 clear_adv_instance(hdev); in adv_timeout_expired()
6928 hci_dev_unlock(hdev); in adv_timeout_expired()
6931 static int add_advertising(struct sock *sk, struct hci_dev *hdev, in add_advertising() argument
6944 BT_DBG("%s", hdev->name); in add_advertising()
6946 status = mgmt_le_support(hdev); in add_advertising()
6948 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6957 supported_flags = get_supported_adv_flags(hdev); in add_advertising()
6959 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6962 hci_dev_lock(hdev); in add_advertising()
6964 if (timeout && !hdev_is_powered(hdev)) { in add_advertising()
6965 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6970 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) || in add_advertising()
6971 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) || in add_advertising()
6972 pending_find(MGMT_OP_SET_LE, hdev)) { in add_advertising()
6973 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6978 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) || in add_advertising()
6979 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len, in add_advertising()
6981 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6986 INIT_DELAYED_WORK(&hdev->adv_instance.timeout_exp, adv_timeout_expired); in add_advertising()
6988 hdev->adv_instance.flags = flags; in add_advertising()
6989 hdev->adv_instance.adv_data_len = cp->adv_data_len; in add_advertising()
6990 hdev->adv_instance.scan_rsp_len = cp->scan_rsp_len; in add_advertising()
6993 memcpy(hdev->adv_instance.adv_data, cp->data, cp->adv_data_len); in add_advertising()
6996 memcpy(hdev->adv_instance.scan_rsp_data, in add_advertising()
6999 if (hdev->adv_instance.timeout) in add_advertising()
7000 cancel_delayed_work(&hdev->adv_instance.timeout_exp); in add_advertising()
7002 hdev->adv_instance.timeout = timeout; in add_advertising()
7005 queue_delayed_work(hdev->workqueue, in add_advertising()
7006 &hdev->adv_instance.timeout_exp, in add_advertising()
7009 if (!hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING_INSTANCE)) in add_advertising()
7010 advertising_added(sk, hdev, 1); in add_advertising()
7015 if (!hdev_is_powered(hdev) || in add_advertising()
7016 hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in add_advertising()
7018 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7026 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data, in add_advertising()
7033 hci_req_init(&req, hdev); in add_advertising()
7044 hci_dev_unlock(hdev); in add_advertising()
7049 static void remove_advertising_complete(struct hci_dev *hdev, u8 status, in remove_advertising_complete() argument
7057 hci_dev_lock(hdev); in remove_advertising_complete()
7063 cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev); in remove_advertising_complete()
7074 hci_dev_unlock(hdev); in remove_advertising_complete()
7077 static int remove_advertising(struct sock *sk, struct hci_dev *hdev, in remove_advertising() argument
7086 BT_DBG("%s", hdev->name); in remove_advertising()
7092 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7095 hci_dev_lock(hdev); in remove_advertising()
7097 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) || in remove_advertising()
7098 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) || in remove_advertising()
7099 pending_find(MGMT_OP_SET_LE, hdev)) { in remove_advertising()
7100 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7105 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) { in remove_advertising()
7106 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7111 if (hdev->adv_instance.timeout) in remove_advertising()
7112 cancel_delayed_work(&hdev->adv_instance.timeout_exp); in remove_advertising()
7114 memset(&hdev->adv_instance, 0, sizeof(hdev->adv_instance)); in remove_advertising()
7116 advertising_removed(sk, hdev, 1); in remove_advertising()
7118 hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE); in remove_advertising()
7123 if (!hdev_is_powered(hdev) || in remove_advertising()
7124 hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in remove_advertising()
7126 err = mgmt_cmd_complete(sk, hdev->id, in remove_advertising()
7132 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADVERTISING, hdev, data, in remove_advertising()
7139 hci_req_init(&req, hdev); in remove_advertising()
7147 hci_dev_unlock(hdev); in remove_advertising()
7241 void mgmt_index_added(struct hci_dev *hdev) in mgmt_index_added() argument
7245 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_added()
7248 switch (hdev->dev_type) { in mgmt_index_added()
7250 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { in mgmt_index_added()
7251 mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev, in mgmt_index_added()
7255 mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, in mgmt_index_added()
7267 ev.bus = hdev->bus; in mgmt_index_added()
7269 mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev), in mgmt_index_added()
7273 void mgmt_index_removed(struct hci_dev *hdev) in mgmt_index_removed() argument
7278 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_removed()
7281 switch (hdev->dev_type) { in mgmt_index_removed()
7283 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); in mgmt_index_removed()
7285 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { in mgmt_index_removed()
7286 mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, in mgmt_index_removed()
7290 mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, in mgmt_index_removed()
7302 ev.bus = hdev->bus; in mgmt_index_removed()
7304 mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev), in mgmt_index_removed()
7311 struct hci_dev *hdev = req->hdev; in restart_le_actions() local
7314 list_for_each_entry(p, &hdev->le_conn_params, list) { in restart_le_actions()
7323 list_add(&p->action, &hdev->pend_le_conns); in restart_le_actions()
7326 list_add(&p->action, &hdev->pend_le_reports); in restart_le_actions()
7336 static void powered_complete(struct hci_dev *hdev, u8 status, u16 opcode) in powered_complete() argument
7338 struct cmd_lookup match = { NULL, hdev }; in powered_complete()
7348 smp_register(hdev); in powered_complete()
7351 hci_dev_lock(hdev); in powered_complete()
7353 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); in powered_complete()
7355 new_settings(hdev, match.sk); in powered_complete()
7357 hci_dev_unlock(hdev); in powered_complete()
7363 static int powered_update_hci(struct hci_dev *hdev) in powered_update_hci() argument
7368 hci_req_init(&req, hdev); in powered_update_hci()
7370 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) && in powered_update_hci()
7371 !lmp_host_ssp_capable(hdev)) { in powered_update_hci()
7376 if (bredr_sc_enabled(hdev) && !lmp_host_sc_capable(hdev)) { in powered_update_hci()
7384 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in powered_update_hci()
7385 lmp_bredr_capable(hdev)) { in powered_update_hci()
7394 if (cp.le != lmp_host_le_capable(hdev) || in powered_update_hci()
7395 cp.simul != lmp_host_le_br_capable(hdev)) in powered_update_hci()
7400 if (lmp_le_capable(hdev)) { in powered_update_hci()
7405 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in powered_update_hci()
7410 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in powered_update_hci()
7411 hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in powered_update_hci()
7417 link_sec = hci_dev_test_flag(hdev, HCI_LINK_SECURITY); in powered_update_hci()
7418 if (link_sec != test_bit(HCI_AUTH, &hdev->flags)) in powered_update_hci()
7422 if (lmp_bredr_capable(hdev)) { in powered_update_hci()
7423 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) in powered_update_hci()
7436 int mgmt_powered(struct hci_dev *hdev, u8 powered) in mgmt_powered() argument
7438 struct cmd_lookup match = { NULL, hdev }; in mgmt_powered()
7442 if (!hci_dev_test_flag(hdev, HCI_MGMT)) in mgmt_powered()
7446 if (powered_update_hci(hdev) == 0) in mgmt_powered()
7449 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, in mgmt_powered()
7454 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); in mgmt_powered()
7463 if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) in mgmt_powered()
7468 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); in mgmt_powered()
7470 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) in mgmt_powered()
7471 mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, in mgmt_powered()
7475 err = new_settings(hdev, match.sk); in mgmt_powered()
7483 void mgmt_set_powered_failed(struct hci_dev *hdev, int err) in mgmt_set_powered_failed() argument
7488 cmd = pending_find(MGMT_OP_SET_POWERED, hdev); in mgmt_set_powered_failed()
7497 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); in mgmt_set_powered_failed()
7502 void mgmt_discoverable_timeout(struct hci_dev *hdev) in mgmt_discoverable_timeout() argument
7506 hci_dev_lock(hdev); in mgmt_discoverable_timeout()
7513 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in mgmt_discoverable_timeout()
7514 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in mgmt_discoverable_timeout()
7516 hci_req_init(&req, hdev); in mgmt_discoverable_timeout()
7517 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in mgmt_discoverable_timeout()
7527 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in mgmt_discoverable_timeout()
7532 hdev->discov_timeout = 0; in mgmt_discoverable_timeout()
7534 new_settings(hdev, NULL); in mgmt_discoverable_timeout()
7536 hci_dev_unlock(hdev); in mgmt_discoverable_timeout()
7539 void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, in mgmt_new_link_key() argument
7553 mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL); in mgmt_new_link_key()
7575 void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent) in mgmt_new_ltk() argument
7610 mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL); in mgmt_new_ltk()
7613 void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk) in mgmt_new_irk() argument
7640 mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL); in mgmt_new_irk()
7643 void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk, in mgmt_new_csrk() argument
7670 mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL); in mgmt_new_csrk()
7673 void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_new_conn_param() argument
7691 mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL); in mgmt_new_conn_param()
7694 void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn, in mgmt_device_connected() argument
7727 mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf, in mgmt_device_connected()
7745 struct hci_dev *hdev = data; in unpair_device_rsp() local
7748 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_rsp()
7754 bool mgmt_powering_down(struct hci_dev *hdev) in mgmt_powering_down() argument
7759 cmd = pending_find(MGMT_OP_SET_POWERED, hdev); in mgmt_powering_down()
7770 void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_device_disconnected() argument
7780 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) { in mgmt_device_disconnected()
7781 cancel_delayed_work(&hdev->power_off); in mgmt_device_disconnected()
7782 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_device_disconnected()
7791 mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk); in mgmt_device_disconnected()
7797 mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk); in mgmt_device_disconnected()
7802 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, in mgmt_device_disconnected()
7803 hdev); in mgmt_device_disconnected()
7806 void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_disconnect_failed() argument
7813 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, in mgmt_disconnect_failed()
7814 hdev); in mgmt_disconnect_failed()
7816 cmd = pending_find(MGMT_OP_DISCONNECT, hdev); in mgmt_disconnect_failed()
7832 void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_connect_failed() argument
7840 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) { in mgmt_connect_failed()
7841 cancel_delayed_work(&hdev->power_off); in mgmt_connect_failed()
7842 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_connect_failed()
7849 mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL); in mgmt_connect_failed()
7852 void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure) in mgmt_pin_code_request() argument
7860 mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL); in mgmt_pin_code_request()
7863 void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_pin_code_reply_complete() argument
7868 cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev); in mgmt_pin_code_reply_complete()
7876 void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_pin_code_neg_reply_complete() argument
7881 cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev); in mgmt_pin_code_neg_reply_complete()
7889 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_request() argument
7895 BT_DBG("%s", hdev->name); in mgmt_user_confirm_request()
7902 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev), in mgmt_user_confirm_request()
7906 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_request() argument
7911 BT_DBG("%s", hdev->name); in mgmt_user_passkey_request()
7916 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev), in mgmt_user_passkey_request()
7920 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in user_pairing_resp_complete() argument
7926 cmd = pending_find(opcode, hdev); in user_pairing_resp_complete()
7936 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_reply_complete() argument
7939 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_confirm_reply_complete()
7943 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_neg_reply_complete() argument
7946 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_confirm_neg_reply_complete()
7951 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_reply_complete() argument
7954 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_passkey_reply_complete()
7958 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_neg_reply_complete() argument
7961 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_passkey_neg_reply_complete()
7966 int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_notify() argument
7972 BT_DBG("%s", hdev->name); in mgmt_user_passkey_notify()
7979 return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL); in mgmt_user_passkey_notify()
7994 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev), in mgmt_auth_failed()
8003 void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) in mgmt_auth_enable_complete() argument
8005 struct cmd_lookup match = { NULL, hdev }; in mgmt_auth_enable_complete()
8010 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, in mgmt_auth_enable_complete()
8015 if (test_bit(HCI_AUTH, &hdev->flags)) in mgmt_auth_enable_complete()
8016 changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY); in mgmt_auth_enable_complete()
8018 changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY); in mgmt_auth_enable_complete()
8020 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp, in mgmt_auth_enable_complete()
8024 new_settings(hdev, match.sk); in mgmt_auth_enable_complete()
8032 struct hci_dev *hdev = req->hdev; in clear_eir() local
8035 if (!lmp_ext_inq_capable(hdev)) in clear_eir()
8038 memset(hdev->eir, 0, sizeof(hdev->eir)); in clear_eir()
8045 void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status) in mgmt_ssp_enable_complete() argument
8047 struct cmd_lookup match = { NULL, hdev }; in mgmt_ssp_enable_complete()
8054 if (enable && hci_dev_test_and_clear_flag(hdev, in mgmt_ssp_enable_complete()
8056 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in mgmt_ssp_enable_complete()
8057 new_settings(hdev, NULL); in mgmt_ssp_enable_complete()
8060 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp, in mgmt_ssp_enable_complete()
8066 changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED); in mgmt_ssp_enable_complete()
8068 changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED); in mgmt_ssp_enable_complete()
8070 changed = hci_dev_test_and_clear_flag(hdev, in mgmt_ssp_enable_complete()
8073 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in mgmt_ssp_enable_complete()
8076 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match); in mgmt_ssp_enable_complete()
8079 new_settings(hdev, match.sk); in mgmt_ssp_enable_complete()
8084 hci_req_init(&req, hdev); in mgmt_ssp_enable_complete()
8086 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in mgmt_ssp_enable_complete()
8087 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in mgmt_ssp_enable_complete()
8108 void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, in mgmt_set_class_of_dev_complete() argument
8111 struct cmd_lookup match = { NULL, hdev, mgmt_status(status) }; in mgmt_set_class_of_dev_complete()
8113 mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
8114 mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
8115 mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
8118 mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, in mgmt_set_class_of_dev_complete()
8125 void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status) in mgmt_set_local_name_complete() argument
8135 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); in mgmt_set_local_name_complete()
8137 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); in mgmt_set_local_name_complete()
8139 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); in mgmt_set_local_name_complete()
8144 if (pending_find(MGMT_OP_SET_POWERED, hdev)) in mgmt_set_local_name_complete()
8148 mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev), in mgmt_set_local_name_complete()
8219 static void restart_le_scan(struct hci_dev *hdev) in restart_le_scan() argument
8222 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN)) in restart_le_scan()
8226 hdev->discovery.scan_start + in restart_le_scan()
8227 hdev->discovery.scan_duration)) in restart_le_scan()
8230 queue_delayed_work(hdev->workqueue, &hdev->le_scan_restart, in restart_le_scan()
8234 static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir, in is_filter_match() argument
8246 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
8248 (rssi < hdev->discovery.rssi && in is_filter_match()
8249 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)))) in is_filter_match()
8252 if (hdev->discovery.uuid_count != 0) { in is_filter_match()
8256 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count, in is_filter_match()
8257 hdev->discovery.uuids) && in is_filter_match()
8259 hdev->discovery.uuid_count, in is_filter_match()
8260 hdev->discovery.uuids)) in is_filter_match()
8267 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) { in is_filter_match()
8268 restart_le_scan(hdev); in is_filter_match()
8271 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
8272 rssi < hdev->discovery.rssi) in is_filter_match()
8279 void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_device_found() argument
8291 if (!hci_discovery_active(hdev)) { in mgmt_device_found()
8294 if (link_type == LE_LINK && list_empty(&hdev->pend_le_reports)) in mgmt_device_found()
8298 if (hdev->discovery.result_filtering) { in mgmt_device_found()
8300 if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp, in mgmt_device_found()
8321 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi && in mgmt_device_found()
8345 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL); in mgmt_device_found()
8348 void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_remote_name() argument
8368 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL); in mgmt_remote_name()
8371 void mgmt_discovering(struct hci_dev *hdev, u8 discovering) in mgmt_discovering() argument
8375 BT_DBG("%s discovering %u", hdev->name, discovering); in mgmt_discovering()
8378 ev.type = hdev->discovery.type; in mgmt_discovering()
8381 mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL); in mgmt_discovering()
8384 static void adv_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in adv_enable_complete() argument
8386 BT_DBG("%s status %u", hdev->name, status); in adv_enable_complete()
8389 void mgmt_reenable_advertising(struct hci_dev *hdev) in mgmt_reenable_advertising() argument
8393 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING) && in mgmt_reenable_advertising()
8394 !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) in mgmt_reenable_advertising()
8397 hci_req_init(&req, hdev); in mgmt_reenable_advertising()