Lines Matching refs:h5

58 struct h5 {
101 int (*setup)(struct h5 *h5);
102 void (*open)(struct h5 *h5);
103 void (*close)(struct h5 *h5);
104 int (*suspend)(struct h5 *h5);
105 int (*resume)(struct h5 *h5);
109 static void h5_reset_rx(struct h5 *h5);
113 struct h5 *h5 = hu->priv;
124 skb_queue_tail(&h5->unrel, nskb);
127 static u8 h5_cfg_field(struct h5 *h5)
130 return h5->tx_win & 0x07;
137 struct h5 *h5 = from_timer(h5, t, timer);
138 struct hci_uart *hu = h5->hu;
144 if (h5->state == H5_UNINITIALIZED)
147 if (h5->state == H5_INITIALIZED) {
148 conf_req[2] = h5_cfg_field(h5);
152 if (h5->state != H5_ACTIVE) {
153 mod_timer(&h5->timer, jiffies + H5_SYNC_TIMEOUT);
157 if (h5->sleep != H5_AWAKE) {
158 h5->sleep = H5_SLEEPING;
162 BT_DBG("hu %p retransmitting %u pkts", hu, h5->unack.qlen);
164 spin_lock_irqsave_nested(&h5->unack.lock, flags, SINGLE_DEPTH_NESTING);
166 while ((skb = __skb_dequeue_tail(&h5->unack)) != NULL) {
167 h5->tx_seq = (h5->tx_seq - 1) & 0x07;
168 skb_queue_head(&h5->rel, skb);
171 spin_unlock_irqrestore(&h5->unack.lock, flags);
179 struct h5 *h5 = hu->priv;
183 h5->state = H5_UNINITIALIZED;
185 del_timer(&h5->timer);
187 skb_queue_purge(&h5->rel);
188 skb_queue_purge(&h5->unrel);
189 skb_queue_purge(&h5->unack);
191 h5->tx_seq = 0;
192 h5->tx_ack = 0;
200 struct h5 *h5;
206 h5 = serdev_device_get_drvdata(hu->serdev);
208 h5 = kzalloc(sizeof(*h5), GFP_KERNEL);
209 if (!h5)
213 hu->priv = h5;
214 h5->hu = hu;
216 skb_queue_head_init(&h5->unack);
217 skb_queue_head_init(&h5->rel);
218 skb_queue_head_init(&h5->unrel);
220 h5_reset_rx(h5);
222 timer_setup(&h5->timer, h5_timed_event, 0);
224 h5->tx_win = H5_TX_WIN_MAX;
226 if (h5->vnd && h5->vnd->open)
227 h5->vnd->open(h5);
233 mod_timer(&h5->timer, jiffies + H5_SYNC_TIMEOUT);
240 struct h5 *h5 = hu->priv;
242 del_timer_sync(&h5->timer);
244 skb_queue_purge(&h5->unack);
245 skb_queue_purge(&h5->rel);
246 skb_queue_purge(&h5->unrel);
248 kfree_skb(h5->rx_skb);
249 h5->rx_skb = NULL;
251 if (h5->vnd && h5->vnd->close)
252 h5->vnd->close(h5);
255 kfree(h5);
262 struct h5 *h5 = hu->priv;
264 if (h5->vnd && h5->vnd->setup)
265 return h5->vnd->setup(h5);
270 static void h5_pkt_cull(struct h5 *h5)
277 spin_lock_irqsave(&h5->unack.lock, flags);
279 to_remove = skb_queue_len(&h5->unack);
283 seq = h5->tx_seq;
286 if (h5->rx_ack == seq)
293 if (seq != h5->rx_ack)
297 skb_queue_walk_safe(&h5->unack, skb, tmp) {
301 __skb_unlink(skb, &h5->unack);
305 if (skb_queue_empty(&h5->unack))
306 del_timer(&h5->timer);
309 spin_unlock_irqrestore(&h5->unack.lock, flags);
314 struct h5 *h5 = hu->priv;
322 const unsigned char *hdr = h5->rx_skb->data;
323 const unsigned char *data = &h5->rx_skb->data[4];
333 conf_req[2] = h5_cfg_field(h5);
336 if (h5->state == H5_ACTIVE)
340 if (h5->state == H5_ACTIVE)
342 h5->state = H5_INITIALIZED;
349 h5->tx_win = (data[2] & 0x07);
350 BT_DBG("Three-wire init complete. tx_win %u", h5->tx_win);
351 h5->state = H5_ACTIVE;
356 h5->sleep = H5_SLEEPING;
360 h5->sleep = H5_AWAKE;
364 h5->sleep = H5_AWAKE;
375 struct h5 *h5 = hu->priv;
376 const unsigned char *hdr = h5->rx_skb->data;
379 h5->tx_ack = (h5->tx_ack + 1) % 8;
380 set_bit(H5_TX_ACK_REQ, &h5->flags);
384 h5->rx_ack = H5_HDR_ACK(hdr);
386 h5_pkt_cull(h5);
393 hci_skb_pkt_type(h5->rx_skb) = H5_HDR_PKT_TYPE(hdr);
396 skb_pull(h5->rx_skb, 4);
398 hci_recv_frame(hu->hdev, h5->rx_skb);
399 h5->rx_skb = NULL;
408 h5_reset_rx(h5);
420 struct h5 *h5 = hu->priv;
421 const unsigned char *hdr = h5->rx_skb->data;
424 h5->rx_func = h5_rx_crc;
425 h5->rx_pending = 2;
435 struct h5 *h5 = hu->priv;
436 const unsigned char *hdr = h5->rx_skb->data;
445 h5_reset_rx(h5);
449 if (H5_HDR_RELIABLE(hdr) && H5_HDR_SEQ(hdr) != h5->tx_ack) {
451 H5_HDR_SEQ(hdr), h5->tx_ack);
452 h5_reset_rx(h5);
456 if (h5->state != H5_ACTIVE &&
459 h5_reset_rx(h5);
463 h5->rx_func = h5_rx_payload;
464 h5->rx_pending = H5_HDR_LEN(hdr);
471 struct h5 *h5 = hu->priv;
476 h5->rx_func = h5_rx_3wire_hdr;
477 h5->rx_pending = 4;
479 h5->rx_skb = bt_skb_alloc(H5_MAX_LEN, GFP_ATOMIC);
480 if (!h5->rx_skb) {
482 h5_reset_rx(h5);
486 h5->rx_skb->dev = (void *)hu->hdev;
493 struct h5 *h5 = hu->priv;
496 h5->rx_func = h5_rx_pkt_start;
501 static void h5_unslip_one_byte(struct h5 *h5, unsigned char c)
506 if (!test_bit(H5_RX_ESC, &h5->flags) && c == SLIP_ESC) {
507 set_bit(H5_RX_ESC, &h5->flags);
511 if (test_and_clear_bit(H5_RX_ESC, &h5->flags)) {
521 h5_reset_rx(h5);
526 skb_put_data(h5->rx_skb, byte, 1);
527 h5->rx_pending--;
529 BT_DBG("unslipped 0x%02hhx, rx_pending %zu", *byte, h5->rx_pending);
532 static void h5_reset_rx(struct h5 *h5)
534 if (h5->rx_skb) {
535 kfree_skb(h5->rx_skb);
536 h5->rx_skb = NULL;
539 h5->rx_func = h5_rx_delimiter;
540 h5->rx_pending = 0;
541 clear_bit(H5_RX_ESC, &h5->flags);
546 struct h5 *h5 = hu->priv;
549 BT_DBG("%s pending %zu count %d", hu->hdev->name, h5->rx_pending,
555 if (h5->rx_pending > 0) {
558 h5_reset_rx(h5);
562 h5_unslip_one_byte(h5, *ptr);
568 processed = h5->rx_func(hu, *ptr);
581 struct h5 *h5 = hu->priv;
589 if (h5->state != H5_ACTIVE) {
598 skb_queue_tail(&h5->rel, skb);
603 skb_queue_tail(&h5->unrel, skb);
657 struct h5 *h5 = hu->priv;
681 hdr[0] = h5->tx_ack << 3;
682 clear_bit(H5_TX_ACK_REQ, &h5->flags);
687 hdr[0] |= h5->tx_seq;
688 h5->tx_seq = (h5->tx_seq + 1) % 8;
713 struct h5 *h5 = hu->priv;
717 if (h5->sleep != H5_AWAKE) {
720 if (h5->sleep == H5_WAKING_UP)
723 h5->sleep = H5_WAKING_UP;
726 mod_timer(&h5->timer, jiffies + HZ / 100);
730 skb = skb_dequeue(&h5->unrel);
739 skb_queue_head(&h5->unrel, skb);
743 spin_lock_irqsave_nested(&h5->unack.lock, flags, SINGLE_DEPTH_NESTING);
745 if (h5->unack.qlen >= h5->tx_win)
748 skb = skb_dequeue(&h5->rel);
753 __skb_queue_tail(&h5->unack, skb);
754 mod_timer(&h5->timer, jiffies + H5_ACK_TIMEOUT);
755 spin_unlock_irqrestore(&h5->unack.lock, flags);
759 skb_queue_head(&h5->rel, skb);
764 spin_unlock_irqrestore(&h5->unack.lock, flags);
766 if (test_bit(H5_TX_ACK_REQ, &h5->flags))
793 struct h5 *h5;
795 h5 = devm_kzalloc(dev, sizeof(*h5), GFP_KERNEL);
796 if (!h5)
799 h5->hu = &h5->serdev_hu;
800 h5->serdev_hu.serdev = serdev;
801 serdev_device_set_drvdata(serdev, h5);
810 h5->vnd = (const struct h5_vnd *)match->driver_data;
811 h5->id = (char *)match->id;
813 if (h5->vnd->acpi_gpio_map)
815 h5->vnd->acpi_gpio_map);
823 h5->vnd = (const struct h5_vnd *)data;
827 h5->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW);
828 if (IS_ERR(h5->enable_gpio))
829 return PTR_ERR(h5->enable_gpio);
831 h5->device_wake_gpio = devm_gpiod_get_optional(dev, "device-wake",
833 if (IS_ERR(h5->device_wake_gpio))
834 return PTR_ERR(h5->device_wake_gpio);
836 return hci_uart_register_device(&h5->serdev_hu, &h5p);
841 struct h5 *h5 = serdev_device_get_drvdata(serdev);
843 hci_uart_unregister_device(&h5->serdev_hu);
848 struct h5 *h5 = dev_get_drvdata(dev);
851 if (h5->vnd && h5->vnd->suspend)
852 ret = h5->vnd->suspend(h5);
859 struct h5 *h5 = dev_get_drvdata(dev);
862 if (h5->vnd && h5->vnd->resume)
863 ret = h5->vnd->resume(h5);
869 static int h5_btrtl_setup(struct h5 *h5)
879 btrtl_dev = btrtl_initialize(h5->hu->hdev, h5->id);
883 err = btrtl_get_uart_settings(h5->hu->hdev, btrtl_dev,
890 skb = __hci_cmd_sync(h5->hu->hdev, 0xfc17, sizeof(baudrate_data),
893 rtl_dev_err(h5->hu->hdev, "set baud rate command failed\n");
902 serdev_device_set_baudrate(h5->hu->serdev, controller_baudrate);
903 serdev_device_set_flow_control(h5->hu->serdev, flow_control);
905 err = btrtl_download_firmware(h5->hu->hdev, btrtl_dev);
912 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &h5->hu->hdev->quirks);
920 static void h5_btrtl_open(struct h5 *h5)
923 serdev_device_set_flow_control(h5->hu->serdev, false);
924 serdev_device_set_parity(h5->hu->serdev, SERDEV_PARITY_EVEN);
925 serdev_device_set_baudrate(h5->hu->serdev, 115200);
928 gpiod_set_value_cansleep(h5->enable_gpio, 1);
929 gpiod_set_value_cansleep(h5->device_wake_gpio, 1);
933 static void h5_btrtl_close(struct h5 *h5)
935 gpiod_set_value_cansleep(h5->device_wake_gpio, 0);
936 gpiod_set_value_cansleep(h5->enable_gpio, 0);
945 static int h5_btrtl_suspend(struct h5 *h5)
947 serdev_device_set_flow_control(h5->hu->serdev, false);
948 gpiod_set_value_cansleep(h5->device_wake_gpio, 0);
949 gpiod_set_value_cansleep(h5->enable_gpio, 0);
973 static int h5_btrtl_resume(struct h5 *h5)
984 reprobe->dev = get_device(&h5->hu->serdev->dev);