Lines Matching refs:hdev
136 bool msft_monitor_supported(struct hci_dev *hdev) in msft_monitor_supported() argument
138 return !!(msft_get_features(hdev) & MSFT_FEATURE_MASK_LE_ADV_MONITOR); in msft_monitor_supported()
141 static bool read_supported_features(struct hci_dev *hdev, in read_supported_features() argument
150 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp, in read_supported_features()
153 bt_dev_err(hdev, "Failed to read MSFT supported features (%ld)", in read_supported_features()
159 bt_dev_err(hdev, "MSFT supported features length mismatch"); in read_supported_features()
179 hdev->msft_curve_validity = true; in read_supported_features()
194 (struct hci_dev *hdev, u16 handle, bool is_mgmt) in msft_find_handle_data() argument
197 struct msft_data *msft = hdev->msft_data; in msft_find_handle_data()
211 (struct hci_dev *hdev, u8 addr_type, bdaddr_t *addr, in msft_find_address_data() argument
215 struct msft_data *msft = hdev->msft_data; in msft_find_address_data()
228 static int msft_monitor_device_del(struct hci_dev *hdev, __u16 mgmt_handle, in msft_monitor_device_del() argument
235 list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices, list) { in msft_monitor_device_del()
244 mgmt_adv_monitor_device_lost(hdev, dev->handle, in msft_monitor_device_del()
258 static int msft_le_monitor_advertisement_cb(struct hci_dev *hdev, u16 opcode, in msft_le_monitor_advertisement_cb() argument
264 struct msft_data *msft = hdev->msft_data; in msft_le_monitor_advertisement_cb()
267 hci_dev_lock(hdev); in msft_le_monitor_advertisement_cb()
295 hci_free_adv_monitor(hdev, monitor); in msft_le_monitor_advertisement_cb()
297 hci_dev_unlock(hdev); in msft_le_monitor_advertisement_cb()
303 static void msft_remove_addr_filters_sync(struct hci_dev *hdev, u8 handle) in msft_remove_addr_filters_sync() argument
307 struct msft_data *msft = hdev->msft_data; in msft_remove_addr_filters_sync()
350 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp, in msft_remove_addr_filters_sync()
359 bt_dev_dbg(hdev, "MSFT: Canceled device %pMR address filter", in msft_remove_addr_filters_sync()
366 static int msft_le_cancel_monitor_advertisement_cb(struct hci_dev *hdev, in msft_le_cancel_monitor_advertisement_cb() argument
373 struct msft_data *msft = hdev->msft_data; in msft_le_cancel_monitor_advertisement_cb()
387 hci_dev_lock(hdev); in msft_le_cancel_monitor_advertisement_cb()
389 handle_data = msft_find_handle_data(hdev, monitor->handle, true); in msft_le_cancel_monitor_advertisement_cb()
399 hci_free_adv_monitor(hdev, monitor); in msft_le_cancel_monitor_advertisement_cb()
402 msft_monitor_device_del(hdev, handle_data->mgmt_handle, in msft_le_cancel_monitor_advertisement_cb()
411 hci_dev_unlock(hdev); in msft_le_cancel_monitor_advertisement_cb()
413 msft_remove_addr_filters_sync(hdev, msft_handle); in msft_le_cancel_monitor_advertisement_cb()
415 hci_dev_unlock(hdev); in msft_le_cancel_monitor_advertisement_cb()
423 static int msft_remove_monitor_sync(struct hci_dev *hdev, in msft_remove_monitor_sync() argument
430 handle_data = msft_find_handle_data(hdev, monitor->handle, true); in msft_remove_monitor_sync()
439 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp, in msft_remove_monitor_sync()
444 return msft_le_cancel_monitor_advertisement_cb(hdev, hdev->msft_opcode, in msft_remove_monitor_sync()
449 int msft_suspend_sync(struct hci_dev *hdev) in msft_suspend_sync() argument
451 struct msft_data *msft = hdev->msft_data; in msft_suspend_sync()
455 if (!msft || !msft_monitor_supported(hdev)) in msft_suspend_sync()
461 monitor = idr_get_next(&hdev->adv_monitors_idr, &handle); in msft_suspend_sync()
465 msft_remove_monitor_sync(hdev, monitor); in msft_suspend_sync()
505 static int msft_add_monitor_sync(struct hci_dev *hdev, in msft_add_monitor_sync() argument
552 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, total_size, cp, in msft_add_monitor_sync()
560 err = msft_le_monitor_advertisement_cb(hdev, hdev->msft_opcode, in msft_add_monitor_sync()
565 handle_data = msft_find_handle_data(hdev, monitor->handle, true); in msft_add_monitor_sync()
582 static void reregister_monitor(struct hci_dev *hdev) in reregister_monitor() argument
585 struct msft_data *msft = hdev->msft_data; in reregister_monitor()
594 monitor = idr_get_next(&hdev->adv_monitors_idr, &handle); in reregister_monitor()
598 msft_add_monitor_sync(hdev, monitor); in reregister_monitor()
608 int msft_resume_sync(struct hci_dev *hdev) in msft_resume_sync() argument
610 struct msft_data *msft = hdev->msft_data; in msft_resume_sync()
612 if (!msft || !msft_monitor_supported(hdev)) in msft_resume_sync()
615 hci_dev_lock(hdev); in msft_resume_sync()
620 hdev->advmon_pend_notify = false; in msft_resume_sync()
621 msft_monitor_device_del(hdev, 0, NULL, 0, true); in msft_resume_sync()
623 hci_dev_unlock(hdev); in msft_resume_sync()
625 reregister_monitor(hdev); in msft_resume_sync()
631 void msft_do_open(struct hci_dev *hdev) in msft_do_open() argument
633 struct msft_data *msft = hdev->msft_data; in msft_do_open()
635 if (hdev->msft_opcode == HCI_OP_NOP) in msft_do_open()
639 bt_dev_err(hdev, "MSFT extension not registered"); in msft_do_open()
643 bt_dev_dbg(hdev, "Initialize MSFT extension"); in msft_do_open()
651 if (!read_supported_features(hdev, msft)) { in msft_do_open()
652 hdev->msft_data = NULL; in msft_do_open()
657 if (msft_monitor_supported(hdev)) { in msft_do_open()
659 msft_set_filter_enable(hdev, true); in msft_do_open()
663 reregister_monitor(hdev); in msft_do_open()
667 void msft_do_close(struct hci_dev *hdev) in msft_do_close() argument
669 struct msft_data *msft = hdev->msft_data; in msft_do_close()
677 bt_dev_dbg(hdev, "Cleanup of MSFT extension"); in msft_do_close()
683 monitor = idr_find(&hdev->adv_monitors_idr, in msft_do_close()
701 hci_dev_lock(hdev); in msft_do_close()
704 hdev->advmon_pend_notify = false; in msft_do_close()
705 msft_monitor_device_del(hdev, 0, NULL, 0, true); in msft_do_close()
707 hci_dev_unlock(hdev); in msft_do_close()
710 static int msft_cancel_address_filter_sync(struct hci_dev *hdev, void *data) in msft_cancel_address_filter_sync() argument
714 struct msft_data *msft = hdev->msft_data; in msft_cancel_address_filter_sync()
719 bt_dev_err(hdev, "MSFT: msft data is freed"); in msft_cancel_address_filter_sync()
724 if (!test_bit(HCI_UP, &hdev->flags)) in msft_cancel_address_filter_sync()
734 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp, in msft_cancel_address_filter_sync()
737 bt_dev_err(hdev, "MSFT: Failed to cancel address (%pMR) filter", in msft_cancel_address_filter_sync()
744 bt_dev_dbg(hdev, "MSFT: Canceled device %pMR address filter", in msft_cancel_address_filter_sync()
753 void msft_register(struct hci_dev *hdev) in msft_register() argument
757 bt_dev_dbg(hdev, "Register MSFT extension"); in msft_register()
761 bt_dev_err(hdev, "Failed to register MSFT extension"); in msft_register()
767 hdev->msft_data = msft; in msft_register()
771 void msft_release(struct hci_dev *hdev) in msft_release() argument
773 struct msft_data *msft = hdev->msft_data; in msft_release()
778 bt_dev_dbg(hdev, "Unregister MSFT extension"); in msft_release()
780 hdev->msft_data = NULL; in msft_release()
788 static void msft_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, in msft_device_found() argument
795 bt_dev_err(hdev, "MSFT vendor event %u: no memory", in msft_device_found()
806 list_add(&dev->list, &hdev->monitored_devices); in msft_device_found()
807 hdev->advmon_pend_notify = true; in msft_device_found()
811 static void msft_device_lost(struct hci_dev *hdev, bdaddr_t *bdaddr, in msft_device_lost() argument
814 if (!msft_monitor_device_del(hdev, mgmt_handle, bdaddr, addr_type, in msft_device_lost()
816 bt_dev_err(hdev, "MSFT vendor event %u: dev %pMR not in list", in msft_device_lost()
821 static void *msft_skb_pull(struct hci_dev *hdev, struct sk_buff *skb, in msft_skb_pull() argument
828 bt_dev_err(hdev, "Malformed MSFT vendor event: 0x%02x", ev); in msft_skb_pull()
833 static int msft_add_address_filter_sync(struct hci_dev *hdev, void *data) in msft_add_address_filter_sync() argument
838 struct msft_data *msft = hdev->msft_data; in msft_add_address_filter_sync()
844 bt_dev_err(hdev, "MSFT: msft data is freed"); in msft_add_address_filter_sync()
849 if (!test_bit(HCI_UP, &hdev->flags)) in msft_add_address_filter_sync()
873 bt_dev_err(hdev, "MSFT: Alloc cmd param err"); in msft_add_address_filter_sync()
888 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, size, cp, in msft_add_address_filter_sync()
893 bt_dev_err(hdev, "Failed to enable address %pMR filter", in msft_add_address_filter_sync()
909 bt_dev_warn(hdev, "MSFT: Remove address (%pMR) filter", in msft_add_address_filter_sync()
916 bt_dev_dbg(hdev, "MSFT: Address %pMR filter enabled", in msft_add_address_filter_sync()
928 (struct hci_dev *hdev, u8 addr_type, bdaddr_t *bdaddr, in msft_add_address_filter() argument
932 struct msft_data *msft = hdev->msft_data; in msft_add_address_filter()
956 err = hci_cmd_sync_queue(hdev, msft_add_address_filter_sync, in msft_add_address_filter()
959 bt_dev_err(hdev, "MSFT: Add address %pMR filter err", bdaddr); in msft_add_address_filter()
965 bt_dev_dbg(hdev, "MSFT: Add device %pMR address filter", in msft_add_address_filter()
972 static void msft_monitor_device_evt(struct hci_dev *hdev, struct sk_buff *skb) in msft_monitor_device_evt() argument
977 struct msft_data *msft = hdev->msft_data; in msft_monitor_device_evt()
981 ev = msft_skb_pull(hdev, skb, MSFT_EV_LE_MONITOR_DEVICE, sizeof(*ev)); in msft_monitor_device_evt()
985 bt_dev_dbg(hdev, in msft_monitor_device_evt()
990 handle_data = msft_find_handle_data(hdev, ev->monitor_handle, false); in msft_monitor_device_evt()
992 if (!hci_test_quirk(hdev, HCI_QUIRK_USE_MSFT_EXT_ADDRESS_FILTER)) { in msft_monitor_device_evt()
1005 address_filter = msft_find_address_data(hdev, ev->addr_type, in msft_monitor_device_evt()
1013 msft_add_address_filter(hdev, ev->addr_type, in msft_monitor_device_evt()
1032 bt_dev_warn(hdev, "MSFT: Unexpected device event %pMR, %u, %u", in msft_monitor_device_evt()
1048 bt_dev_err(hdev, in msft_monitor_device_evt()
1055 msft_device_found(hdev, &ev->bdaddr, addr_type, mgmt_handle); in msft_monitor_device_evt()
1059 hci_cmd_sync_queue(hdev, in msft_monitor_device_evt()
1064 msft_device_lost(hdev, &ev->bdaddr, addr_type, mgmt_handle); in msft_monitor_device_evt()
1068 void msft_vendor_evt(struct hci_dev *hdev, void *data, struct sk_buff *skb) in msft_vendor_evt() argument
1070 struct msft_data *msft = hdev->msft_data; in msft_vendor_evt()
1081 evt_prefix = msft_skb_pull(hdev, skb, 0, msft->evt_prefix_len); in msft_vendor_evt()
1095 evt = msft_skb_pull(hdev, skb, 0, sizeof(*evt)); in msft_vendor_evt()
1099 hci_dev_lock(hdev); in msft_vendor_evt()
1104 msft_monitor_device_evt(hdev, skb); in msft_vendor_evt()
1109 bt_dev_dbg(hdev, "MSFT vendor event 0x%02x", *evt); in msft_vendor_evt()
1113 hci_dev_unlock(hdev); in msft_vendor_evt()
1116 __u64 msft_get_features(struct hci_dev *hdev) in msft_get_features() argument
1118 struct msft_data *msft = hdev->msft_data; in msft_get_features()
1123 static void msft_le_set_advertisement_filter_enable_cb(struct hci_dev *hdev, in msft_le_set_advertisement_filter_enable_cb() argument
1128 struct msft_data *msft = hdev->msft_data; in msft_le_set_advertisement_filter_enable_cb()
1140 hci_dev_lock(hdev); in msft_le_set_advertisement_filter_enable_cb()
1145 bt_dev_warn(hdev, "MSFT filter_enable is already %s", in msft_le_set_advertisement_filter_enable_cb()
1148 hci_dev_unlock(hdev); in msft_le_set_advertisement_filter_enable_cb()
1152 int msft_add_monitor_pattern(struct hci_dev *hdev, struct adv_monitor *monitor) in msft_add_monitor_pattern() argument
1154 struct msft_data *msft = hdev->msft_data; in msft_add_monitor_pattern()
1162 return msft_add_monitor_sync(hdev, monitor); in msft_add_monitor_pattern()
1166 int msft_remove_monitor(struct hci_dev *hdev, struct adv_monitor *monitor) in msft_remove_monitor() argument
1168 struct msft_data *msft = hdev->msft_data; in msft_remove_monitor()
1176 return msft_remove_monitor_sync(hdev, monitor); in msft_remove_monitor()
1179 int msft_set_filter_enable(struct hci_dev *hdev, bool enable) in msft_set_filter_enable() argument
1182 struct msft_data *msft = hdev->msft_data; in msft_set_filter_enable()
1190 err = __hci_cmd_sync_status(hdev, hdev->msft_opcode, sizeof(cp), &cp, in msft_set_filter_enable()
1193 msft_le_set_advertisement_filter_enable_cb(hdev, &cp, err); in msft_set_filter_enable()
1198 bool msft_curve_validity(struct hci_dev *hdev) in msft_curve_validity() argument
1200 return hdev->msft_curve_validity; in msft_curve_validity()