Lines Matching refs:hdev
107 bool msft_monitor_supported(struct hci_dev *hdev) in msft_monitor_supported() argument
109 return !!(msft_get_features(hdev) & MSFT_FEATURE_MASK_LE_ADV_MONITOR); in msft_monitor_supported()
112 static bool read_supported_features(struct hci_dev *hdev, in read_supported_features() argument
121 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp, in read_supported_features()
127 bt_dev_err(hdev, "Failed to read MSFT supported features (%ld)", in read_supported_features()
133 bt_dev_err(hdev, "MSFT supported features length mismatch"); in read_supported_features()
153 hdev->msft_curve_validity = true; in read_supported_features()
168 (struct hci_dev *hdev, u16 handle, bool is_mgmt) in msft_find_handle_data() argument
171 struct msft_data *msft = hdev->msft_data; in msft_find_handle_data()
184 static int msft_monitor_device_del(struct hci_dev *hdev, __u16 mgmt_handle, in msft_monitor_device_del() argument
191 list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices, list) { in msft_monitor_device_del()
200 mgmt_adv_monitor_device_lost(hdev, dev->handle, in msft_monitor_device_del()
214 static int msft_le_monitor_advertisement_cb(struct hci_dev *hdev, u16 opcode, in msft_le_monitor_advertisement_cb() argument
220 struct msft_data *msft = hdev->msft_data; in msft_le_monitor_advertisement_cb()
223 hci_dev_lock(hdev); in msft_le_monitor_advertisement_cb()
250 hci_free_adv_monitor(hdev, monitor); in msft_le_monitor_advertisement_cb()
252 hci_dev_unlock(hdev); in msft_le_monitor_advertisement_cb()
257 static int msft_le_cancel_monitor_advertisement_cb(struct hci_dev *hdev, in msft_le_cancel_monitor_advertisement_cb() argument
264 struct msft_data *msft = hdev->msft_data; in msft_le_cancel_monitor_advertisement_cb()
277 hci_dev_lock(hdev); in msft_le_cancel_monitor_advertisement_cb()
279 handle_data = msft_find_handle_data(hdev, monitor->handle, true); in msft_le_cancel_monitor_advertisement_cb()
289 hci_free_adv_monitor(hdev, monitor); in msft_le_cancel_monitor_advertisement_cb()
292 msft_monitor_device_del(hdev, handle_data->mgmt_handle, in msft_le_cancel_monitor_advertisement_cb()
300 hci_dev_unlock(hdev); in msft_le_cancel_monitor_advertisement_cb()
307 static int msft_remove_monitor_sync(struct hci_dev *hdev, in msft_remove_monitor_sync() argument
314 handle_data = msft_find_handle_data(hdev, monitor->handle, true); in msft_remove_monitor_sync()
323 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, sizeof(cp), &cp, in msft_remove_monitor_sync()
331 return msft_le_cancel_monitor_advertisement_cb(hdev, hdev->msft_opcode, in msft_remove_monitor_sync()
336 int msft_suspend_sync(struct hci_dev *hdev) in msft_suspend_sync() argument
338 struct msft_data *msft = hdev->msft_data; in msft_suspend_sync()
342 if (!msft || !msft_monitor_supported(hdev)) in msft_suspend_sync()
348 monitor = idr_get_next(&hdev->adv_monitors_idr, &handle); in msft_suspend_sync()
352 msft_remove_monitor_sync(hdev, monitor); in msft_suspend_sync()
392 static int msft_add_monitor_sync(struct hci_dev *hdev, in msft_add_monitor_sync() argument
437 skb = __hci_cmd_sync(hdev, hdev->msft_opcode, total_size, cp, in msft_add_monitor_sync()
447 return msft_le_monitor_advertisement_cb(hdev, hdev->msft_opcode, in msft_add_monitor_sync()
452 static void reregister_monitor(struct hci_dev *hdev) in reregister_monitor() argument
455 struct msft_data *msft = hdev->msft_data; in reregister_monitor()
464 monitor = idr_get_next(&hdev->adv_monitors_idr, &handle); in reregister_monitor()
468 msft_add_monitor_sync(hdev, monitor); in reregister_monitor()
478 int msft_resume_sync(struct hci_dev *hdev) in msft_resume_sync() argument
480 struct msft_data *msft = hdev->msft_data; in msft_resume_sync()
482 if (!msft || !msft_monitor_supported(hdev)) in msft_resume_sync()
485 hci_dev_lock(hdev); in msft_resume_sync()
490 hdev->advmon_pend_notify = false; in msft_resume_sync()
491 msft_monitor_device_del(hdev, 0, NULL, 0, true); in msft_resume_sync()
493 hci_dev_unlock(hdev); in msft_resume_sync()
495 reregister_monitor(hdev); in msft_resume_sync()
501 void msft_do_open(struct hci_dev *hdev) in msft_do_open() argument
503 struct msft_data *msft = hdev->msft_data; in msft_do_open()
505 if (hdev->msft_opcode == HCI_OP_NOP) in msft_do_open()
509 bt_dev_err(hdev, "MSFT extension not registered"); in msft_do_open()
513 bt_dev_dbg(hdev, "Initialize MSFT extension"); in msft_do_open()
521 if (!read_supported_features(hdev, msft)) { in msft_do_open()
522 hdev->msft_data = NULL; in msft_do_open()
527 if (msft_monitor_supported(hdev)) { in msft_do_open()
529 msft_set_filter_enable(hdev, true); in msft_do_open()
533 reregister_monitor(hdev); in msft_do_open()
537 void msft_do_close(struct hci_dev *hdev) in msft_do_close() argument
539 struct msft_data *msft = hdev->msft_data; in msft_do_close()
546 bt_dev_dbg(hdev, "Cleanup of MSFT extension"); in msft_do_close()
552 monitor = idr_find(&hdev->adv_monitors_idr, in msft_do_close()
562 hci_dev_lock(hdev); in msft_do_close()
565 hdev->advmon_pend_notify = false; in msft_do_close()
566 msft_monitor_device_del(hdev, 0, NULL, 0, true); in msft_do_close()
568 hci_dev_unlock(hdev); in msft_do_close()
571 void msft_register(struct hci_dev *hdev) in msft_register() argument
575 bt_dev_dbg(hdev, "Register MSFT extension"); in msft_register()
579 bt_dev_err(hdev, "Failed to register MSFT extension"); in msft_register()
584 hdev->msft_data = msft; in msft_register()
587 void msft_unregister(struct hci_dev *hdev) in msft_unregister() argument
589 struct msft_data *msft = hdev->msft_data; in msft_unregister()
594 bt_dev_dbg(hdev, "Unregister MSFT extension"); in msft_unregister()
596 hdev->msft_data = NULL; in msft_unregister()
603 static void msft_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, in msft_device_found() argument
610 bt_dev_err(hdev, "MSFT vendor event %u: no memory", in msft_device_found()
621 list_add(&dev->list, &hdev->monitored_devices); in msft_device_found()
622 hdev->advmon_pend_notify = true; in msft_device_found()
626 static void msft_device_lost(struct hci_dev *hdev, bdaddr_t *bdaddr, in msft_device_lost() argument
629 if (!msft_monitor_device_del(hdev, mgmt_handle, bdaddr, addr_type, in msft_device_lost()
631 bt_dev_err(hdev, "MSFT vendor event %u: dev %pMR not in list", in msft_device_lost()
636 static void *msft_skb_pull(struct hci_dev *hdev, struct sk_buff *skb, in msft_skb_pull() argument
643 bt_dev_err(hdev, "Malformed MSFT vendor event: 0x%02x", ev); in msft_skb_pull()
649 static void msft_monitor_device_evt(struct hci_dev *hdev, struct sk_buff *skb) in msft_monitor_device_evt() argument
655 ev = msft_skb_pull(hdev, skb, MSFT_EV_LE_MONITOR_DEVICE, sizeof(*ev)); in msft_monitor_device_evt()
659 bt_dev_dbg(hdev, in msft_monitor_device_evt()
664 handle_data = msft_find_handle_data(hdev, ev->monitor_handle, false); in msft_monitor_device_evt()
678 bt_dev_err(hdev, in msft_monitor_device_evt()
685 msft_device_found(hdev, &ev->bdaddr, addr_type, in msft_monitor_device_evt()
688 msft_device_lost(hdev, &ev->bdaddr, addr_type, in msft_monitor_device_evt()
692 void msft_vendor_evt(struct hci_dev *hdev, void *data, struct sk_buff *skb) in msft_vendor_evt() argument
694 struct msft_data *msft = hdev->msft_data; in msft_vendor_evt()
705 evt_prefix = msft_skb_pull(hdev, skb, 0, msft->evt_prefix_len); in msft_vendor_evt()
719 evt = msft_skb_pull(hdev, skb, 0, sizeof(*evt)); in msft_vendor_evt()
723 hci_dev_lock(hdev); in msft_vendor_evt()
727 msft_monitor_device_evt(hdev, skb); in msft_vendor_evt()
731 bt_dev_dbg(hdev, "MSFT vendor event 0x%02x", *evt); in msft_vendor_evt()
735 hci_dev_unlock(hdev); in msft_vendor_evt()
738 __u64 msft_get_features(struct hci_dev *hdev) in msft_get_features() argument
740 struct msft_data *msft = hdev->msft_data; in msft_get_features()
745 static void msft_le_set_advertisement_filter_enable_cb(struct hci_dev *hdev, in msft_le_set_advertisement_filter_enable_cb() argument
751 struct msft_data *msft = hdev->msft_data; in msft_le_set_advertisement_filter_enable_cb()
767 hci_dev_lock(hdev); in msft_le_set_advertisement_filter_enable_cb()
769 cp = hci_sent_cmd_data(hdev, hdev->msft_opcode); in msft_le_set_advertisement_filter_enable_cb()
773 bt_dev_warn(hdev, "MSFT filter_enable is already %s", in msft_le_set_advertisement_filter_enable_cb()
776 hci_dev_unlock(hdev); in msft_le_set_advertisement_filter_enable_cb()
780 int msft_add_monitor_pattern(struct hci_dev *hdev, struct adv_monitor *monitor) in msft_add_monitor_pattern() argument
782 struct msft_data *msft = hdev->msft_data; in msft_add_monitor_pattern()
790 return msft_add_monitor_sync(hdev, monitor); in msft_add_monitor_pattern()
794 int msft_remove_monitor(struct hci_dev *hdev, struct adv_monitor *monitor) in msft_remove_monitor() argument
796 struct msft_data *msft = hdev->msft_data; in msft_remove_monitor()
804 return msft_remove_monitor_sync(hdev, monitor); in msft_remove_monitor()
809 struct hci_dev *hdev = req->hdev; in msft_req_add_set_filter_enable() local
815 hci_req_add(req, hdev->msft_opcode, sizeof(cp), &cp); in msft_req_add_set_filter_enable()
818 int msft_set_filter_enable(struct hci_dev *hdev, bool enable) in msft_set_filter_enable() argument
821 struct msft_data *msft = hdev->msft_data; in msft_set_filter_enable()
827 hci_req_init(&req, hdev); in msft_set_filter_enable()
834 bool msft_curve_validity(struct hci_dev *hdev) in msft_curve_validity() argument
836 return hdev->msft_curve_validity; in msft_curve_validity()