Lines Matching refs:hu
77 int (*rx_func)(struct hci_uart *hu, u8 c);
80 struct hci_uart *hu; /* Parent HCI UART */ member
125 static void h5_link_control(struct hci_uart *hu, const void *data, size_t len) in h5_link_control() argument
127 struct h5 *h5 = hu->priv; in h5_link_control()
152 struct hci_uart *hu = h5->hu; in h5_timed_event() local
156 BT_DBG("%s", hu->hdev->name); in h5_timed_event()
159 h5_link_control(hu, sync_req, sizeof(sync_req)); in h5_timed_event()
163 h5_link_control(hu, conf_req, sizeof(conf_req)); in h5_timed_event()
176 BT_DBG("hu %p retransmitting %u pkts", hu, h5->unack.qlen); in h5_timed_event()
188 hci_uart_tx_wakeup(hu); in h5_timed_event()
191 static void h5_peer_reset(struct hci_uart *hu) in h5_peer_reset() argument
193 struct h5 *h5 = hu->priv; in h5_peer_reset()
195 bt_dev_err(hu->hdev, "Peer device has reset"); in h5_peer_reset()
209 hci_reset_dev(hu->hdev); in h5_peer_reset()
212 static int h5_open(struct hci_uart *hu) in h5_open() argument
217 BT_DBG("hu %p", hu); in h5_open()
219 if (hu->serdev) { in h5_open()
220 h5 = serdev_device_get_drvdata(hu->serdev); in h5_open()
227 hu->priv = h5; in h5_open()
228 h5->hu = hu; in h5_open()
243 set_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags); in h5_open()
246 h5_link_control(hu, sync, sizeof(sync)); in h5_open()
252 static int h5_close(struct hci_uart *hu) in h5_close() argument
254 struct h5 *h5 = hu->priv; in h5_close()
268 if (!hu->serdev) in h5_close()
274 static int h5_setup(struct hci_uart *hu) in h5_setup() argument
276 struct h5 *h5 = hu->priv; in h5_setup()
326 static void h5_handle_internal_rx(struct hci_uart *hu) in h5_handle_internal_rx() argument
328 struct h5 *h5 = hu->priv; in h5_handle_internal_rx()
339 BT_DBG("%s", hu->hdev->name); in h5_handle_internal_rx()
351 h5_peer_reset(hu); in h5_handle_internal_rx()
352 h5_link_control(hu, sync_rsp, 2); in h5_handle_internal_rx()
355 h5_peer_reset(hu); in h5_handle_internal_rx()
357 h5_link_control(hu, conf_req, 3); in h5_handle_internal_rx()
359 h5_link_control(hu, conf_rsp, 2); in h5_handle_internal_rx()
360 h5_link_control(hu, conf_req, 3); in h5_handle_internal_rx()
366 hci_uart_init_ready(hu); in h5_handle_internal_rx()
377 h5_link_control(hu, woken_req, 2); in h5_handle_internal_rx()
384 hci_uart_tx_wakeup(hu); in h5_handle_internal_rx()
387 static void h5_complete_rx_pkt(struct hci_uart *hu) in h5_complete_rx_pkt() argument
389 struct h5 *h5 = hu->priv; in h5_complete_rx_pkt()
395 hci_uart_tx_wakeup(hu); in h5_complete_rx_pkt()
412 hci_recv_frame(hu->hdev, h5->rx_skb); in h5_complete_rx_pkt()
418 h5_handle_internal_rx(hu); in h5_complete_rx_pkt()
425 static int h5_rx_crc(struct hci_uart *hu, unsigned char c) in h5_rx_crc() argument
427 h5_complete_rx_pkt(hu); in h5_rx_crc()
432 static int h5_rx_payload(struct hci_uart *hu, unsigned char c) in h5_rx_payload() argument
434 struct h5 *h5 = hu->priv; in h5_rx_payload()
441 h5_complete_rx_pkt(hu); in h5_rx_payload()
447 static int h5_rx_3wire_hdr(struct hci_uart *hu, unsigned char c) in h5_rx_3wire_hdr() argument
449 struct h5 *h5 = hu->priv; in h5_rx_3wire_hdr()
453 hu->hdev->name, H5_HDR_SEQ(hdr), H5_HDR_ACK(hdr), in h5_rx_3wire_hdr()
458 bt_dev_err(hu->hdev, "Invalid header checksum"); in h5_rx_3wire_hdr()
464 bt_dev_err(hu->hdev, "Out-of-order packet arrived (%u != %u)", in h5_rx_3wire_hdr()
472 bt_dev_err(hu->hdev, "Non-link packet received in non-active state"); in h5_rx_3wire_hdr()
483 static int h5_rx_pkt_start(struct hci_uart *hu, unsigned char c) in h5_rx_pkt_start() argument
485 struct h5 *h5 = hu->priv; in h5_rx_pkt_start()
495 bt_dev_err(hu->hdev, "Can't allocate mem for new packet"); in h5_rx_pkt_start()
500 h5->rx_skb->dev = (void *)hu->hdev; in h5_rx_pkt_start()
505 static int h5_rx_delimiter(struct hci_uart *hu, unsigned char c) in h5_rx_delimiter() argument
507 struct h5 *h5 = hu->priv; in h5_rx_delimiter()
558 static int h5_recv(struct hci_uart *hu, const void *data, int count) in h5_recv() argument
560 struct h5 *h5 = hu->priv; in h5_recv()
563 BT_DBG("%s pending %zu count %d", hu->hdev->name, h5->rx_pending, in h5_recv()
571 bt_dev_err(hu->hdev, "Too short H5 packet"); in h5_recv()
582 processed = h5->rx_func(hu, *ptr); in h5_recv()
590 if (hu->serdev) { in h5_recv()
591 pm_runtime_get(&hu->serdev->dev); in h5_recv()
592 pm_runtime_mark_last_busy(&hu->serdev->dev); in h5_recv()
593 pm_runtime_put_autosuspend(&hu->serdev->dev); in h5_recv()
599 static int h5_enqueue(struct hci_uart *hu, struct sk_buff *skb) in h5_enqueue() argument
601 struct h5 *h5 = hu->priv; in h5_enqueue()
604 bt_dev_err(hu->hdev, "Packet too long (%u bytes)", skb->len); in h5_enqueue()
610 bt_dev_err(hu->hdev, "Ignoring HCI data in non-active state"); in h5_enqueue()
627 bt_dev_err(hu->hdev, "Unknown packet type %u", hci_skb_pkt_type(skb)); in h5_enqueue()
632 if (hu->serdev) { in h5_enqueue()
633 pm_runtime_get_sync(&hu->serdev->dev); in h5_enqueue()
634 pm_runtime_mark_last_busy(&hu->serdev->dev); in h5_enqueue()
635 pm_runtime_put_autosuspend(&hu->serdev->dev); in h5_enqueue()
680 static struct sk_buff *h5_prepare_pkt(struct hci_uart *hu, u8 pkt_type, in h5_prepare_pkt() argument
683 struct h5 *h5 = hu->priv; in h5_prepare_pkt()
689 bt_dev_err(hu->hdev, "Unknown packet type %u", pkt_type); in h5_prepare_pkt()
722 hu->hdev->name, H5_HDR_SEQ(hdr), H5_HDR_ACK(hdr), in h5_prepare_pkt()
737 static struct sk_buff *h5_dequeue(struct hci_uart *hu) in h5_dequeue() argument
739 struct h5 *h5 = hu->priv; in h5_dequeue()
753 return h5_prepare_pkt(hu, HCI_3WIRE_LINK_PKT, wakeup_req, 2); in h5_dequeue()
758 nskb = h5_prepare_pkt(hu, hci_skb_pkt_type(skb), in h5_dequeue()
766 bt_dev_err(hu->hdev, "Could not dequeue pkt because alloc_skb failed"); in h5_dequeue()
776 nskb = h5_prepare_pkt(hu, hci_skb_pkt_type(skb), in h5_dequeue()
786 bt_dev_err(hu->hdev, "Could not dequeue pkt because alloc_skb failed"); in h5_dequeue()
793 return h5_prepare_pkt(hu, HCI_3WIRE_ACK_PKT, NULL, 0); in h5_dequeue()
798 static int h5_flush(struct hci_uart *hu) in h5_flush() argument
800 BT_DBG("hu %p", hu); in h5_flush()
826 h5->hu = &h5->serdev_hu; in h5_serdev_probe()
907 btrtl_dev = btrtl_initialize(h5->hu->hdev, h5->id); in h5_btrtl_setup()
911 err = btrtl_get_uart_settings(h5->hu->hdev, btrtl_dev, in h5_btrtl_setup()
918 skb = __hci_cmd_sync(h5->hu->hdev, 0xfc17, sizeof(baudrate_data), in h5_btrtl_setup()
921 rtl_dev_err(h5->hu->hdev, "set baud rate command failed\n"); in h5_btrtl_setup()
930 serdev_device_set_baudrate(h5->hu->serdev, controller_baudrate); in h5_btrtl_setup()
931 serdev_device_set_flow_control(h5->hu->serdev, flow_control); in h5_btrtl_setup()
936 err = btrtl_download_firmware(h5->hu->hdev, btrtl_dev); in h5_btrtl_setup()
940 btrtl_set_quirks(h5->hu->hdev, btrtl_dev); in h5_btrtl_setup()
956 set_bit(HCI_UART_NO_SUSPEND_NOTIFIER, &h5->hu->flags); in h5_btrtl_open()
959 serdev_device_set_flow_control(h5->hu->serdev, false); in h5_btrtl_open()
960 serdev_device_set_parity(h5->hu->serdev, SERDEV_PARITY_EVEN); in h5_btrtl_open()
961 serdev_device_set_baudrate(h5->hu->serdev, 115200); in h5_btrtl_open()
964 pm_runtime_set_active(&h5->hu->serdev->dev); in h5_btrtl_open()
965 pm_runtime_use_autosuspend(&h5->hu->serdev->dev); in h5_btrtl_open()
966 pm_runtime_set_autosuspend_delay(&h5->hu->serdev->dev, in h5_btrtl_open()
968 pm_runtime_enable(&h5->hu->serdev->dev); in h5_btrtl_open()
985 pm_runtime_disable(&h5->hu->serdev->dev); in h5_btrtl_close()
999 serdev_device_set_flow_control(h5->hu->serdev, false); in h5_btrtl_suspend()
1040 reprobe->dev = get_device(&h5->hu->serdev->dev); in h5_btrtl_resume()
1046 serdev_device_set_flow_control(h5->hu->serdev, true); in h5_btrtl_resume()