1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Bluetooth HCI Three-wire UART driver
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (C) 2012 Intel Corporation
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/acpi.h>
10*4882a593Smuzhiyun #include <linux/errno.h>
11*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
12*4882a593Smuzhiyun #include <linux/kernel.h>
13*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
14*4882a593Smuzhiyun #include <linux/of_device.h>
15*4882a593Smuzhiyun #include <linux/serdev.h>
16*4882a593Smuzhiyun #include <linux/skbuff.h>
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <net/bluetooth/bluetooth.h>
19*4882a593Smuzhiyun #include <net/bluetooth/hci_core.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #include "btrtl.h"
22*4882a593Smuzhiyun #include "hci_uart.h"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #define HCI_3WIRE_ACK_PKT 0
25*4882a593Smuzhiyun #define HCI_3WIRE_LINK_PKT 15
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /* Sliding window size */
28*4882a593Smuzhiyun #define H5_TX_WIN_MAX 4
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define H5_ACK_TIMEOUT msecs_to_jiffies(250)
31*4882a593Smuzhiyun #define H5_SYNC_TIMEOUT msecs_to_jiffies(100)
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun * Maximum Three-wire packet:
35*4882a593Smuzhiyun * 4 byte header + max value for 12-bit length + 2 bytes for CRC
36*4882a593Smuzhiyun */
37*4882a593Smuzhiyun #define H5_MAX_LEN (4 + 0xfff + 2)
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun /* Convenience macros for reading Three-wire header values */
40*4882a593Smuzhiyun #define H5_HDR_SEQ(hdr) ((hdr)[0] & 0x07)
41*4882a593Smuzhiyun #define H5_HDR_ACK(hdr) (((hdr)[0] >> 3) & 0x07)
42*4882a593Smuzhiyun #define H5_HDR_CRC(hdr) (((hdr)[0] >> 6) & 0x01)
43*4882a593Smuzhiyun #define H5_HDR_RELIABLE(hdr) (((hdr)[0] >> 7) & 0x01)
44*4882a593Smuzhiyun #define H5_HDR_PKT_TYPE(hdr) ((hdr)[1] & 0x0f)
45*4882a593Smuzhiyun #define H5_HDR_LEN(hdr) ((((hdr)[1] >> 4) & 0x0f) + ((hdr)[2] << 4))
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #define SLIP_DELIMITER 0xc0
48*4882a593Smuzhiyun #define SLIP_ESC 0xdb
49*4882a593Smuzhiyun #define SLIP_ESC_DELIM 0xdc
50*4882a593Smuzhiyun #define SLIP_ESC_ESC 0xdd
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /* H5 state flags */
53*4882a593Smuzhiyun enum {
54*4882a593Smuzhiyun H5_RX_ESC, /* SLIP escape mode */
55*4882a593Smuzhiyun H5_TX_ACK_REQ, /* Pending ack to send */
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun struct h5 {
59*4882a593Smuzhiyun /* Must be the first member, hci_serdev.c expects this. */
60*4882a593Smuzhiyun struct hci_uart serdev_hu;
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun struct sk_buff_head unack; /* Unack'ed packets queue */
63*4882a593Smuzhiyun struct sk_buff_head rel; /* Reliable packets queue */
64*4882a593Smuzhiyun struct sk_buff_head unrel; /* Unreliable packets queue */
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun unsigned long flags;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun struct sk_buff *rx_skb; /* Receive buffer */
69*4882a593Smuzhiyun size_t rx_pending; /* Expecting more bytes */
70*4882a593Smuzhiyun u8 rx_ack; /* Last ack number received */
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun int (*rx_func)(struct hci_uart *hu, u8 c);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun struct timer_list timer; /* Retransmission timer */
75*4882a593Smuzhiyun struct hci_uart *hu; /* Parent HCI UART */
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun u8 tx_seq; /* Next seq number to send */
78*4882a593Smuzhiyun u8 tx_ack; /* Next ack number to send */
79*4882a593Smuzhiyun u8 tx_win; /* Sliding window size */
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun enum {
82*4882a593Smuzhiyun H5_UNINITIALIZED,
83*4882a593Smuzhiyun H5_INITIALIZED,
84*4882a593Smuzhiyun H5_ACTIVE,
85*4882a593Smuzhiyun } state;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun enum {
88*4882a593Smuzhiyun H5_AWAKE,
89*4882a593Smuzhiyun H5_SLEEPING,
90*4882a593Smuzhiyun H5_WAKING_UP,
91*4882a593Smuzhiyun } sleep;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun const struct h5_vnd *vnd;
94*4882a593Smuzhiyun const char *id;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun struct gpio_desc *enable_gpio;
97*4882a593Smuzhiyun struct gpio_desc *device_wake_gpio;
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun struct h5_vnd {
101*4882a593Smuzhiyun int (*setup)(struct h5 *h5);
102*4882a593Smuzhiyun void (*open)(struct h5 *h5);
103*4882a593Smuzhiyun void (*close)(struct h5 *h5);
104*4882a593Smuzhiyun int (*suspend)(struct h5 *h5);
105*4882a593Smuzhiyun int (*resume)(struct h5 *h5);
106*4882a593Smuzhiyun const struct acpi_gpio_mapping *acpi_gpio_map;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun static void h5_reset_rx(struct h5 *h5);
110*4882a593Smuzhiyun
h5_link_control(struct hci_uart * hu,const void * data,size_t len)111*4882a593Smuzhiyun static void h5_link_control(struct hci_uart *hu, const void *data, size_t len)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
114*4882a593Smuzhiyun struct sk_buff *nskb;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun nskb = alloc_skb(3, GFP_ATOMIC);
117*4882a593Smuzhiyun if (!nskb)
118*4882a593Smuzhiyun return;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun hci_skb_pkt_type(nskb) = HCI_3WIRE_LINK_PKT;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun skb_put_data(nskb, data, len);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun skb_queue_tail(&h5->unrel, nskb);
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
h5_cfg_field(struct h5 * h5)127*4882a593Smuzhiyun static u8 h5_cfg_field(struct h5 *h5)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun /* Sliding window size (first 3 bits) */
130*4882a593Smuzhiyun return h5->tx_win & 0x07;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun
h5_timed_event(struct timer_list * t)133*4882a593Smuzhiyun static void h5_timed_event(struct timer_list *t)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun const unsigned char sync_req[] = { 0x01, 0x7e };
136*4882a593Smuzhiyun unsigned char conf_req[3] = { 0x03, 0xfc };
137*4882a593Smuzhiyun struct h5 *h5 = from_timer(h5, t, timer);
138*4882a593Smuzhiyun struct hci_uart *hu = h5->hu;
139*4882a593Smuzhiyun struct sk_buff *skb;
140*4882a593Smuzhiyun unsigned long flags;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun BT_DBG("%s", hu->hdev->name);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun if (h5->state == H5_UNINITIALIZED)
145*4882a593Smuzhiyun h5_link_control(hu, sync_req, sizeof(sync_req));
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun if (h5->state == H5_INITIALIZED) {
148*4882a593Smuzhiyun conf_req[2] = h5_cfg_field(h5);
149*4882a593Smuzhiyun h5_link_control(hu, conf_req, sizeof(conf_req));
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun if (h5->state != H5_ACTIVE) {
153*4882a593Smuzhiyun mod_timer(&h5->timer, jiffies + H5_SYNC_TIMEOUT);
154*4882a593Smuzhiyun goto wakeup;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun if (h5->sleep != H5_AWAKE) {
158*4882a593Smuzhiyun h5->sleep = H5_SLEEPING;
159*4882a593Smuzhiyun goto wakeup;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun BT_DBG("hu %p retransmitting %u pkts", hu, h5->unack.qlen);
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun spin_lock_irqsave_nested(&h5->unack.lock, flags, SINGLE_DEPTH_NESTING);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun while ((skb = __skb_dequeue_tail(&h5->unack)) != NULL) {
167*4882a593Smuzhiyun h5->tx_seq = (h5->tx_seq - 1) & 0x07;
168*4882a593Smuzhiyun skb_queue_head(&h5->rel, skb);
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun spin_unlock_irqrestore(&h5->unack.lock, flags);
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun wakeup:
174*4882a593Smuzhiyun hci_uart_tx_wakeup(hu);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun
h5_peer_reset(struct hci_uart * hu)177*4882a593Smuzhiyun static void h5_peer_reset(struct hci_uart *hu)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Peer device has reset");
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun h5->state = H5_UNINITIALIZED;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun del_timer(&h5->timer);
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun skb_queue_purge(&h5->rel);
188*4882a593Smuzhiyun skb_queue_purge(&h5->unrel);
189*4882a593Smuzhiyun skb_queue_purge(&h5->unack);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun h5->tx_seq = 0;
192*4882a593Smuzhiyun h5->tx_ack = 0;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /* Send reset request to upper stack */
195*4882a593Smuzhiyun hci_reset_dev(hu->hdev);
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
h5_open(struct hci_uart * hu)198*4882a593Smuzhiyun static int h5_open(struct hci_uart *hu)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun struct h5 *h5;
201*4882a593Smuzhiyun const unsigned char sync[] = { 0x01, 0x7e };
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun BT_DBG("hu %p", hu);
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun if (hu->serdev) {
206*4882a593Smuzhiyun h5 = serdev_device_get_drvdata(hu->serdev);
207*4882a593Smuzhiyun } else {
208*4882a593Smuzhiyun h5 = kzalloc(sizeof(*h5), GFP_KERNEL);
209*4882a593Smuzhiyun if (!h5)
210*4882a593Smuzhiyun return -ENOMEM;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun hu->priv = h5;
214*4882a593Smuzhiyun h5->hu = hu;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun skb_queue_head_init(&h5->unack);
217*4882a593Smuzhiyun skb_queue_head_init(&h5->rel);
218*4882a593Smuzhiyun skb_queue_head_init(&h5->unrel);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun h5_reset_rx(h5);
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun timer_setup(&h5->timer, h5_timed_event, 0);
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun h5->tx_win = H5_TX_WIN_MAX;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun if (h5->vnd && h5->vnd->open)
227*4882a593Smuzhiyun h5->vnd->open(h5);
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun set_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags);
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun /* Send initial sync request */
232*4882a593Smuzhiyun h5_link_control(hu, sync, sizeof(sync));
233*4882a593Smuzhiyun mod_timer(&h5->timer, jiffies + H5_SYNC_TIMEOUT);
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun return 0;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
h5_close(struct hci_uart * hu)238*4882a593Smuzhiyun static int h5_close(struct hci_uart *hu)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun del_timer_sync(&h5->timer);
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun skb_queue_purge(&h5->unack);
245*4882a593Smuzhiyun skb_queue_purge(&h5->rel);
246*4882a593Smuzhiyun skb_queue_purge(&h5->unrel);
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun kfree_skb(h5->rx_skb);
249*4882a593Smuzhiyun h5->rx_skb = NULL;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun if (h5->vnd && h5->vnd->close)
252*4882a593Smuzhiyun h5->vnd->close(h5);
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun if (!hu->serdev)
255*4882a593Smuzhiyun kfree(h5);
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun return 0;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun
h5_setup(struct hci_uart * hu)260*4882a593Smuzhiyun static int h5_setup(struct hci_uart *hu)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun if (h5->vnd && h5->vnd->setup)
265*4882a593Smuzhiyun return h5->vnd->setup(h5);
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun return 0;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
h5_pkt_cull(struct h5 * h5)270*4882a593Smuzhiyun static void h5_pkt_cull(struct h5 *h5)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun struct sk_buff *skb, *tmp;
273*4882a593Smuzhiyun unsigned long flags;
274*4882a593Smuzhiyun int i, to_remove;
275*4882a593Smuzhiyun u8 seq;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun spin_lock_irqsave(&h5->unack.lock, flags);
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun to_remove = skb_queue_len(&h5->unack);
280*4882a593Smuzhiyun if (to_remove == 0)
281*4882a593Smuzhiyun goto unlock;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun seq = h5->tx_seq;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun while (to_remove > 0) {
286*4882a593Smuzhiyun if (h5->rx_ack == seq)
287*4882a593Smuzhiyun break;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun to_remove--;
290*4882a593Smuzhiyun seq = (seq - 1) & 0x07;
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun if (seq != h5->rx_ack)
294*4882a593Smuzhiyun BT_ERR("Controller acked invalid packet");
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun i = 0;
297*4882a593Smuzhiyun skb_queue_walk_safe(&h5->unack, skb, tmp) {
298*4882a593Smuzhiyun if (i++ >= to_remove)
299*4882a593Smuzhiyun break;
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun __skb_unlink(skb, &h5->unack);
302*4882a593Smuzhiyun kfree_skb(skb);
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun if (skb_queue_empty(&h5->unack))
306*4882a593Smuzhiyun del_timer(&h5->timer);
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun unlock:
309*4882a593Smuzhiyun spin_unlock_irqrestore(&h5->unack.lock, flags);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
h5_handle_internal_rx(struct hci_uart * hu)312*4882a593Smuzhiyun static void h5_handle_internal_rx(struct hci_uart *hu)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
315*4882a593Smuzhiyun const unsigned char sync_req[] = { 0x01, 0x7e };
316*4882a593Smuzhiyun const unsigned char sync_rsp[] = { 0x02, 0x7d };
317*4882a593Smuzhiyun unsigned char conf_req[3] = { 0x03, 0xfc };
318*4882a593Smuzhiyun const unsigned char conf_rsp[] = { 0x04, 0x7b };
319*4882a593Smuzhiyun const unsigned char wakeup_req[] = { 0x05, 0xfa };
320*4882a593Smuzhiyun const unsigned char woken_req[] = { 0x06, 0xf9 };
321*4882a593Smuzhiyun const unsigned char sleep_req[] = { 0x07, 0x78 };
322*4882a593Smuzhiyun const unsigned char *hdr = h5->rx_skb->data;
323*4882a593Smuzhiyun const unsigned char *data = &h5->rx_skb->data[4];
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun BT_DBG("%s", hu->hdev->name);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun if (H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT)
328*4882a593Smuzhiyun return;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun if (H5_HDR_LEN(hdr) < 2)
331*4882a593Smuzhiyun return;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun conf_req[2] = h5_cfg_field(h5);
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun if (memcmp(data, sync_req, 2) == 0) {
336*4882a593Smuzhiyun if (h5->state == H5_ACTIVE)
337*4882a593Smuzhiyun h5_peer_reset(hu);
338*4882a593Smuzhiyun h5_link_control(hu, sync_rsp, 2);
339*4882a593Smuzhiyun } else if (memcmp(data, sync_rsp, 2) == 0) {
340*4882a593Smuzhiyun if (h5->state == H5_ACTIVE)
341*4882a593Smuzhiyun h5_peer_reset(hu);
342*4882a593Smuzhiyun h5->state = H5_INITIALIZED;
343*4882a593Smuzhiyun h5_link_control(hu, conf_req, 3);
344*4882a593Smuzhiyun } else if (memcmp(data, conf_req, 2) == 0) {
345*4882a593Smuzhiyun h5_link_control(hu, conf_rsp, 2);
346*4882a593Smuzhiyun h5_link_control(hu, conf_req, 3);
347*4882a593Smuzhiyun } else if (memcmp(data, conf_rsp, 2) == 0) {
348*4882a593Smuzhiyun if (H5_HDR_LEN(hdr) > 2)
349*4882a593Smuzhiyun h5->tx_win = (data[2] & 0x07);
350*4882a593Smuzhiyun BT_DBG("Three-wire init complete. tx_win %u", h5->tx_win);
351*4882a593Smuzhiyun h5->state = H5_ACTIVE;
352*4882a593Smuzhiyun hci_uart_init_ready(hu);
353*4882a593Smuzhiyun return;
354*4882a593Smuzhiyun } else if (memcmp(data, sleep_req, 2) == 0) {
355*4882a593Smuzhiyun BT_DBG("Peer went to sleep");
356*4882a593Smuzhiyun h5->sleep = H5_SLEEPING;
357*4882a593Smuzhiyun return;
358*4882a593Smuzhiyun } else if (memcmp(data, woken_req, 2) == 0) {
359*4882a593Smuzhiyun BT_DBG("Peer woke up");
360*4882a593Smuzhiyun h5->sleep = H5_AWAKE;
361*4882a593Smuzhiyun } else if (memcmp(data, wakeup_req, 2) == 0) {
362*4882a593Smuzhiyun BT_DBG("Peer requested wakeup");
363*4882a593Smuzhiyun h5_link_control(hu, woken_req, 2);
364*4882a593Smuzhiyun h5->sleep = H5_AWAKE;
365*4882a593Smuzhiyun } else {
366*4882a593Smuzhiyun BT_DBG("Link Control: 0x%02hhx 0x%02hhx", data[0], data[1]);
367*4882a593Smuzhiyun return;
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun hci_uart_tx_wakeup(hu);
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
h5_complete_rx_pkt(struct hci_uart * hu)373*4882a593Smuzhiyun static void h5_complete_rx_pkt(struct hci_uart *hu)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
376*4882a593Smuzhiyun const unsigned char *hdr = h5->rx_skb->data;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun if (H5_HDR_RELIABLE(hdr)) {
379*4882a593Smuzhiyun h5->tx_ack = (h5->tx_ack + 1) % 8;
380*4882a593Smuzhiyun set_bit(H5_TX_ACK_REQ, &h5->flags);
381*4882a593Smuzhiyun hci_uart_tx_wakeup(hu);
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun h5->rx_ack = H5_HDR_ACK(hdr);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun h5_pkt_cull(h5);
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun switch (H5_HDR_PKT_TYPE(hdr)) {
389*4882a593Smuzhiyun case HCI_EVENT_PKT:
390*4882a593Smuzhiyun case HCI_ACLDATA_PKT:
391*4882a593Smuzhiyun case HCI_SCODATA_PKT:
392*4882a593Smuzhiyun case HCI_ISODATA_PKT:
393*4882a593Smuzhiyun hci_skb_pkt_type(h5->rx_skb) = H5_HDR_PKT_TYPE(hdr);
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun /* Remove Three-wire header */
396*4882a593Smuzhiyun skb_pull(h5->rx_skb, 4);
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun hci_recv_frame(hu->hdev, h5->rx_skb);
399*4882a593Smuzhiyun h5->rx_skb = NULL;
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun break;
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun default:
404*4882a593Smuzhiyun h5_handle_internal_rx(hu);
405*4882a593Smuzhiyun break;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun h5_reset_rx(h5);
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun
h5_rx_crc(struct hci_uart * hu,unsigned char c)411*4882a593Smuzhiyun static int h5_rx_crc(struct hci_uart *hu, unsigned char c)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun h5_complete_rx_pkt(hu);
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun return 0;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun
h5_rx_payload(struct hci_uart * hu,unsigned char c)418*4882a593Smuzhiyun static int h5_rx_payload(struct hci_uart *hu, unsigned char c)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
421*4882a593Smuzhiyun const unsigned char *hdr = h5->rx_skb->data;
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun if (H5_HDR_CRC(hdr)) {
424*4882a593Smuzhiyun h5->rx_func = h5_rx_crc;
425*4882a593Smuzhiyun h5->rx_pending = 2;
426*4882a593Smuzhiyun } else {
427*4882a593Smuzhiyun h5_complete_rx_pkt(hu);
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun return 0;
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
h5_rx_3wire_hdr(struct hci_uart * hu,unsigned char c)433*4882a593Smuzhiyun static int h5_rx_3wire_hdr(struct hci_uart *hu, unsigned char c)
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
436*4882a593Smuzhiyun const unsigned char *hdr = h5->rx_skb->data;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun BT_DBG("%s rx: seq %u ack %u crc %u rel %u type %u len %u",
439*4882a593Smuzhiyun hu->hdev->name, H5_HDR_SEQ(hdr), H5_HDR_ACK(hdr),
440*4882a593Smuzhiyun H5_HDR_CRC(hdr), H5_HDR_RELIABLE(hdr), H5_HDR_PKT_TYPE(hdr),
441*4882a593Smuzhiyun H5_HDR_LEN(hdr));
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun if (((hdr[0] + hdr[1] + hdr[2] + hdr[3]) & 0xff) != 0xff) {
444*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Invalid header checksum");
445*4882a593Smuzhiyun h5_reset_rx(h5);
446*4882a593Smuzhiyun return 0;
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun if (H5_HDR_RELIABLE(hdr) && H5_HDR_SEQ(hdr) != h5->tx_ack) {
450*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Out-of-order packet arrived (%u != %u)",
451*4882a593Smuzhiyun H5_HDR_SEQ(hdr), h5->tx_ack);
452*4882a593Smuzhiyun h5_reset_rx(h5);
453*4882a593Smuzhiyun return 0;
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun if (h5->state != H5_ACTIVE &&
457*4882a593Smuzhiyun H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT) {
458*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Non-link packet received in non-active state");
459*4882a593Smuzhiyun h5_reset_rx(h5);
460*4882a593Smuzhiyun return 0;
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun h5->rx_func = h5_rx_payload;
464*4882a593Smuzhiyun h5->rx_pending = H5_HDR_LEN(hdr);
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun return 0;
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun
h5_rx_pkt_start(struct hci_uart * hu,unsigned char c)469*4882a593Smuzhiyun static int h5_rx_pkt_start(struct hci_uart *hu, unsigned char c)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun if (c == SLIP_DELIMITER)
474*4882a593Smuzhiyun return 1;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun h5->rx_func = h5_rx_3wire_hdr;
477*4882a593Smuzhiyun h5->rx_pending = 4;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun h5->rx_skb = bt_skb_alloc(H5_MAX_LEN, GFP_ATOMIC);
480*4882a593Smuzhiyun if (!h5->rx_skb) {
481*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Can't allocate mem for new packet");
482*4882a593Smuzhiyun h5_reset_rx(h5);
483*4882a593Smuzhiyun return -ENOMEM;
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun h5->rx_skb->dev = (void *)hu->hdev;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun return 0;
489*4882a593Smuzhiyun }
490*4882a593Smuzhiyun
h5_rx_delimiter(struct hci_uart * hu,unsigned char c)491*4882a593Smuzhiyun static int h5_rx_delimiter(struct hci_uart *hu, unsigned char c)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun if (c == SLIP_DELIMITER)
496*4882a593Smuzhiyun h5->rx_func = h5_rx_pkt_start;
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun return 1;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun
h5_unslip_one_byte(struct h5 * h5,unsigned char c)501*4882a593Smuzhiyun static void h5_unslip_one_byte(struct h5 *h5, unsigned char c)
502*4882a593Smuzhiyun {
503*4882a593Smuzhiyun const u8 delim = SLIP_DELIMITER, esc = SLIP_ESC;
504*4882a593Smuzhiyun const u8 *byte = &c;
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun if (!test_bit(H5_RX_ESC, &h5->flags) && c == SLIP_ESC) {
507*4882a593Smuzhiyun set_bit(H5_RX_ESC, &h5->flags);
508*4882a593Smuzhiyun return;
509*4882a593Smuzhiyun }
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun if (test_and_clear_bit(H5_RX_ESC, &h5->flags)) {
512*4882a593Smuzhiyun switch (c) {
513*4882a593Smuzhiyun case SLIP_ESC_DELIM:
514*4882a593Smuzhiyun byte = &delim;
515*4882a593Smuzhiyun break;
516*4882a593Smuzhiyun case SLIP_ESC_ESC:
517*4882a593Smuzhiyun byte = &esc;
518*4882a593Smuzhiyun break;
519*4882a593Smuzhiyun default:
520*4882a593Smuzhiyun BT_ERR("Invalid esc byte 0x%02hhx", c);
521*4882a593Smuzhiyun h5_reset_rx(h5);
522*4882a593Smuzhiyun return;
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun skb_put_data(h5->rx_skb, byte, 1);
527*4882a593Smuzhiyun h5->rx_pending--;
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun BT_DBG("unslipped 0x%02hhx, rx_pending %zu", *byte, h5->rx_pending);
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun
h5_reset_rx(struct h5 * h5)532*4882a593Smuzhiyun static void h5_reset_rx(struct h5 *h5)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun if (h5->rx_skb) {
535*4882a593Smuzhiyun kfree_skb(h5->rx_skb);
536*4882a593Smuzhiyun h5->rx_skb = NULL;
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun h5->rx_func = h5_rx_delimiter;
540*4882a593Smuzhiyun h5->rx_pending = 0;
541*4882a593Smuzhiyun clear_bit(H5_RX_ESC, &h5->flags);
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun
h5_recv(struct hci_uart * hu,const void * data,int count)544*4882a593Smuzhiyun static int h5_recv(struct hci_uart *hu, const void *data, int count)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
547*4882a593Smuzhiyun const unsigned char *ptr = data;
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun BT_DBG("%s pending %zu count %d", hu->hdev->name, h5->rx_pending,
550*4882a593Smuzhiyun count);
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun while (count > 0) {
553*4882a593Smuzhiyun int processed;
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun if (h5->rx_pending > 0) {
556*4882a593Smuzhiyun if (*ptr == SLIP_DELIMITER) {
557*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Too short H5 packet");
558*4882a593Smuzhiyun h5_reset_rx(h5);
559*4882a593Smuzhiyun continue;
560*4882a593Smuzhiyun }
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun h5_unslip_one_byte(h5, *ptr);
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun ptr++; count--;
565*4882a593Smuzhiyun continue;
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun processed = h5->rx_func(hu, *ptr);
569*4882a593Smuzhiyun if (processed < 0)
570*4882a593Smuzhiyun return processed;
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun ptr += processed;
573*4882a593Smuzhiyun count -= processed;
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun return 0;
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
h5_enqueue(struct hci_uart * hu,struct sk_buff * skb)579*4882a593Smuzhiyun static int h5_enqueue(struct hci_uart *hu, struct sk_buff *skb)
580*4882a593Smuzhiyun {
581*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun if (skb->len > 0xfff) {
584*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Packet too long (%u bytes)", skb->len);
585*4882a593Smuzhiyun kfree_skb(skb);
586*4882a593Smuzhiyun return 0;
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun if (h5->state != H5_ACTIVE) {
590*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Ignoring HCI data in non-active state");
591*4882a593Smuzhiyun kfree_skb(skb);
592*4882a593Smuzhiyun return 0;
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun switch (hci_skb_pkt_type(skb)) {
596*4882a593Smuzhiyun case HCI_ACLDATA_PKT:
597*4882a593Smuzhiyun case HCI_COMMAND_PKT:
598*4882a593Smuzhiyun skb_queue_tail(&h5->rel, skb);
599*4882a593Smuzhiyun break;
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun case HCI_SCODATA_PKT:
602*4882a593Smuzhiyun case HCI_ISODATA_PKT:
603*4882a593Smuzhiyun skb_queue_tail(&h5->unrel, skb);
604*4882a593Smuzhiyun break;
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun default:
607*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Unknown packet type %u", hci_skb_pkt_type(skb));
608*4882a593Smuzhiyun kfree_skb(skb);
609*4882a593Smuzhiyun break;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun return 0;
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
h5_slip_delim(struct sk_buff * skb)615*4882a593Smuzhiyun static void h5_slip_delim(struct sk_buff *skb)
616*4882a593Smuzhiyun {
617*4882a593Smuzhiyun const char delim = SLIP_DELIMITER;
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun skb_put_data(skb, &delim, 1);
620*4882a593Smuzhiyun }
621*4882a593Smuzhiyun
h5_slip_one_byte(struct sk_buff * skb,u8 c)622*4882a593Smuzhiyun static void h5_slip_one_byte(struct sk_buff *skb, u8 c)
623*4882a593Smuzhiyun {
624*4882a593Smuzhiyun const char esc_delim[2] = { SLIP_ESC, SLIP_ESC_DELIM };
625*4882a593Smuzhiyun const char esc_esc[2] = { SLIP_ESC, SLIP_ESC_ESC };
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun switch (c) {
628*4882a593Smuzhiyun case SLIP_DELIMITER:
629*4882a593Smuzhiyun skb_put_data(skb, &esc_delim, 2);
630*4882a593Smuzhiyun break;
631*4882a593Smuzhiyun case SLIP_ESC:
632*4882a593Smuzhiyun skb_put_data(skb, &esc_esc, 2);
633*4882a593Smuzhiyun break;
634*4882a593Smuzhiyun default:
635*4882a593Smuzhiyun skb_put_data(skb, &c, 1);
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
valid_packet_type(u8 type)639*4882a593Smuzhiyun static bool valid_packet_type(u8 type)
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun switch (type) {
642*4882a593Smuzhiyun case HCI_ACLDATA_PKT:
643*4882a593Smuzhiyun case HCI_COMMAND_PKT:
644*4882a593Smuzhiyun case HCI_SCODATA_PKT:
645*4882a593Smuzhiyun case HCI_ISODATA_PKT:
646*4882a593Smuzhiyun case HCI_3WIRE_LINK_PKT:
647*4882a593Smuzhiyun case HCI_3WIRE_ACK_PKT:
648*4882a593Smuzhiyun return true;
649*4882a593Smuzhiyun default:
650*4882a593Smuzhiyun return false;
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun
h5_prepare_pkt(struct hci_uart * hu,u8 pkt_type,const u8 * data,size_t len)654*4882a593Smuzhiyun static struct sk_buff *h5_prepare_pkt(struct hci_uart *hu, u8 pkt_type,
655*4882a593Smuzhiyun const u8 *data, size_t len)
656*4882a593Smuzhiyun {
657*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
658*4882a593Smuzhiyun struct sk_buff *nskb;
659*4882a593Smuzhiyun u8 hdr[4];
660*4882a593Smuzhiyun int i;
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun if (!valid_packet_type(pkt_type)) {
663*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Unknown packet type %u", pkt_type);
664*4882a593Smuzhiyun return NULL;
665*4882a593Smuzhiyun }
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun /*
668*4882a593Smuzhiyun * Max len of packet: (original len + 4 (H5 hdr) + 2 (crc)) * 2
669*4882a593Smuzhiyun * (because bytes 0xc0 and 0xdb are escaped, worst case is when
670*4882a593Smuzhiyun * the packet is all made of 0xc0 and 0xdb) + 2 (0xc0
671*4882a593Smuzhiyun * delimiters at start and end).
672*4882a593Smuzhiyun */
673*4882a593Smuzhiyun nskb = alloc_skb((len + 6) * 2 + 2, GFP_ATOMIC);
674*4882a593Smuzhiyun if (!nskb)
675*4882a593Smuzhiyun return NULL;
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun hci_skb_pkt_type(nskb) = pkt_type;
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun h5_slip_delim(nskb);
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun hdr[0] = h5->tx_ack << 3;
682*4882a593Smuzhiyun clear_bit(H5_TX_ACK_REQ, &h5->flags);
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun /* Reliable packet? */
685*4882a593Smuzhiyun if (pkt_type == HCI_ACLDATA_PKT || pkt_type == HCI_COMMAND_PKT) {
686*4882a593Smuzhiyun hdr[0] |= 1 << 7;
687*4882a593Smuzhiyun hdr[0] |= h5->tx_seq;
688*4882a593Smuzhiyun h5->tx_seq = (h5->tx_seq + 1) % 8;
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun hdr[1] = pkt_type | ((len & 0x0f) << 4);
692*4882a593Smuzhiyun hdr[2] = len >> 4;
693*4882a593Smuzhiyun hdr[3] = ~((hdr[0] + hdr[1] + hdr[2]) & 0xff);
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun BT_DBG("%s tx: seq %u ack %u crc %u rel %u type %u len %u",
696*4882a593Smuzhiyun hu->hdev->name, H5_HDR_SEQ(hdr), H5_HDR_ACK(hdr),
697*4882a593Smuzhiyun H5_HDR_CRC(hdr), H5_HDR_RELIABLE(hdr), H5_HDR_PKT_TYPE(hdr),
698*4882a593Smuzhiyun H5_HDR_LEN(hdr));
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun for (i = 0; i < 4; i++)
701*4882a593Smuzhiyun h5_slip_one_byte(nskb, hdr[i]);
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun for (i = 0; i < len; i++)
704*4882a593Smuzhiyun h5_slip_one_byte(nskb, data[i]);
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun h5_slip_delim(nskb);
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun return nskb;
709*4882a593Smuzhiyun }
710*4882a593Smuzhiyun
h5_dequeue(struct hci_uart * hu)711*4882a593Smuzhiyun static struct sk_buff *h5_dequeue(struct hci_uart *hu)
712*4882a593Smuzhiyun {
713*4882a593Smuzhiyun struct h5 *h5 = hu->priv;
714*4882a593Smuzhiyun unsigned long flags;
715*4882a593Smuzhiyun struct sk_buff *skb, *nskb;
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun if (h5->sleep != H5_AWAKE) {
718*4882a593Smuzhiyun const unsigned char wakeup_req[] = { 0x05, 0xfa };
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun if (h5->sleep == H5_WAKING_UP)
721*4882a593Smuzhiyun return NULL;
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun h5->sleep = H5_WAKING_UP;
724*4882a593Smuzhiyun BT_DBG("Sending wakeup request");
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun mod_timer(&h5->timer, jiffies + HZ / 100);
727*4882a593Smuzhiyun return h5_prepare_pkt(hu, HCI_3WIRE_LINK_PKT, wakeup_req, 2);
728*4882a593Smuzhiyun }
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun skb = skb_dequeue(&h5->unrel);
731*4882a593Smuzhiyun if (skb) {
732*4882a593Smuzhiyun nskb = h5_prepare_pkt(hu, hci_skb_pkt_type(skb),
733*4882a593Smuzhiyun skb->data, skb->len);
734*4882a593Smuzhiyun if (nskb) {
735*4882a593Smuzhiyun kfree_skb(skb);
736*4882a593Smuzhiyun return nskb;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun skb_queue_head(&h5->unrel, skb);
740*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Could not dequeue pkt because alloc_skb failed");
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun spin_lock_irqsave_nested(&h5->unack.lock, flags, SINGLE_DEPTH_NESTING);
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun if (h5->unack.qlen >= h5->tx_win)
746*4882a593Smuzhiyun goto unlock;
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun skb = skb_dequeue(&h5->rel);
749*4882a593Smuzhiyun if (skb) {
750*4882a593Smuzhiyun nskb = h5_prepare_pkt(hu, hci_skb_pkt_type(skb),
751*4882a593Smuzhiyun skb->data, skb->len);
752*4882a593Smuzhiyun if (nskb) {
753*4882a593Smuzhiyun __skb_queue_tail(&h5->unack, skb);
754*4882a593Smuzhiyun mod_timer(&h5->timer, jiffies + H5_ACK_TIMEOUT);
755*4882a593Smuzhiyun spin_unlock_irqrestore(&h5->unack.lock, flags);
756*4882a593Smuzhiyun return nskb;
757*4882a593Smuzhiyun }
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun skb_queue_head(&h5->rel, skb);
760*4882a593Smuzhiyun bt_dev_err(hu->hdev, "Could not dequeue pkt because alloc_skb failed");
761*4882a593Smuzhiyun }
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun unlock:
764*4882a593Smuzhiyun spin_unlock_irqrestore(&h5->unack.lock, flags);
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun if (test_bit(H5_TX_ACK_REQ, &h5->flags))
767*4882a593Smuzhiyun return h5_prepare_pkt(hu, HCI_3WIRE_ACK_PKT, NULL, 0);
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun return NULL;
770*4882a593Smuzhiyun }
771*4882a593Smuzhiyun
h5_flush(struct hci_uart * hu)772*4882a593Smuzhiyun static int h5_flush(struct hci_uart *hu)
773*4882a593Smuzhiyun {
774*4882a593Smuzhiyun BT_DBG("hu %p", hu);
775*4882a593Smuzhiyun return 0;
776*4882a593Smuzhiyun }
777*4882a593Smuzhiyun
778*4882a593Smuzhiyun static const struct hci_uart_proto h5p = {
779*4882a593Smuzhiyun .id = HCI_UART_3WIRE,
780*4882a593Smuzhiyun .name = "Three-wire (H5)",
781*4882a593Smuzhiyun .open = h5_open,
782*4882a593Smuzhiyun .close = h5_close,
783*4882a593Smuzhiyun .setup = h5_setup,
784*4882a593Smuzhiyun .recv = h5_recv,
785*4882a593Smuzhiyun .enqueue = h5_enqueue,
786*4882a593Smuzhiyun .dequeue = h5_dequeue,
787*4882a593Smuzhiyun .flush = h5_flush,
788*4882a593Smuzhiyun };
789*4882a593Smuzhiyun
h5_serdev_probe(struct serdev_device * serdev)790*4882a593Smuzhiyun static int h5_serdev_probe(struct serdev_device *serdev)
791*4882a593Smuzhiyun {
792*4882a593Smuzhiyun struct device *dev = &serdev->dev;
793*4882a593Smuzhiyun struct h5 *h5;
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun h5 = devm_kzalloc(dev, sizeof(*h5), GFP_KERNEL);
796*4882a593Smuzhiyun if (!h5)
797*4882a593Smuzhiyun return -ENOMEM;
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun h5->hu = &h5->serdev_hu;
800*4882a593Smuzhiyun h5->serdev_hu.serdev = serdev;
801*4882a593Smuzhiyun serdev_device_set_drvdata(serdev, h5);
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun if (has_acpi_companion(dev)) {
804*4882a593Smuzhiyun const struct acpi_device_id *match;
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun match = acpi_match_device(dev->driver->acpi_match_table, dev);
807*4882a593Smuzhiyun if (!match)
808*4882a593Smuzhiyun return -ENODEV;
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun h5->vnd = (const struct h5_vnd *)match->driver_data;
811*4882a593Smuzhiyun h5->id = (char *)match->id;
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun if (h5->vnd->acpi_gpio_map)
814*4882a593Smuzhiyun devm_acpi_dev_add_driver_gpios(dev,
815*4882a593Smuzhiyun h5->vnd->acpi_gpio_map);
816*4882a593Smuzhiyun } else {
817*4882a593Smuzhiyun const void *data;
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun data = of_device_get_match_data(dev);
820*4882a593Smuzhiyun if (!data)
821*4882a593Smuzhiyun return -ENODEV;
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun h5->vnd = (const struct h5_vnd *)data;
824*4882a593Smuzhiyun }
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun h5->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW);
828*4882a593Smuzhiyun if (IS_ERR(h5->enable_gpio))
829*4882a593Smuzhiyun return PTR_ERR(h5->enable_gpio);
830*4882a593Smuzhiyun
831*4882a593Smuzhiyun h5->device_wake_gpio = devm_gpiod_get_optional(dev, "device-wake",
832*4882a593Smuzhiyun GPIOD_OUT_LOW);
833*4882a593Smuzhiyun if (IS_ERR(h5->device_wake_gpio))
834*4882a593Smuzhiyun return PTR_ERR(h5->device_wake_gpio);
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun return hci_uart_register_device(&h5->serdev_hu, &h5p);
837*4882a593Smuzhiyun }
838*4882a593Smuzhiyun
h5_serdev_remove(struct serdev_device * serdev)839*4882a593Smuzhiyun static void h5_serdev_remove(struct serdev_device *serdev)
840*4882a593Smuzhiyun {
841*4882a593Smuzhiyun struct h5 *h5 = serdev_device_get_drvdata(serdev);
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun hci_uart_unregister_device(&h5->serdev_hu);
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun
h5_serdev_suspend(struct device * dev)846*4882a593Smuzhiyun static int __maybe_unused h5_serdev_suspend(struct device *dev)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun struct h5 *h5 = dev_get_drvdata(dev);
849*4882a593Smuzhiyun int ret = 0;
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun if (h5->vnd && h5->vnd->suspend)
852*4882a593Smuzhiyun ret = h5->vnd->suspend(h5);
853*4882a593Smuzhiyun
854*4882a593Smuzhiyun return ret;
855*4882a593Smuzhiyun }
856*4882a593Smuzhiyun
h5_serdev_resume(struct device * dev)857*4882a593Smuzhiyun static int __maybe_unused h5_serdev_resume(struct device *dev)
858*4882a593Smuzhiyun {
859*4882a593Smuzhiyun struct h5 *h5 = dev_get_drvdata(dev);
860*4882a593Smuzhiyun int ret = 0;
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun if (h5->vnd && h5->vnd->resume)
863*4882a593Smuzhiyun ret = h5->vnd->resume(h5);
864*4882a593Smuzhiyun
865*4882a593Smuzhiyun return ret;
866*4882a593Smuzhiyun }
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun #ifdef CONFIG_BT_HCIUART_RTL
h5_btrtl_setup(struct h5 * h5)869*4882a593Smuzhiyun static int h5_btrtl_setup(struct h5 *h5)
870*4882a593Smuzhiyun {
871*4882a593Smuzhiyun struct btrtl_device_info *btrtl_dev;
872*4882a593Smuzhiyun struct sk_buff *skb;
873*4882a593Smuzhiyun __le32 baudrate_data;
874*4882a593Smuzhiyun u32 device_baudrate;
875*4882a593Smuzhiyun unsigned int controller_baudrate;
876*4882a593Smuzhiyun bool flow_control;
877*4882a593Smuzhiyun int err;
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun btrtl_dev = btrtl_initialize(h5->hu->hdev, h5->id);
880*4882a593Smuzhiyun if (IS_ERR(btrtl_dev))
881*4882a593Smuzhiyun return PTR_ERR(btrtl_dev);
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun err = btrtl_get_uart_settings(h5->hu->hdev, btrtl_dev,
884*4882a593Smuzhiyun &controller_baudrate, &device_baudrate,
885*4882a593Smuzhiyun &flow_control);
886*4882a593Smuzhiyun if (err)
887*4882a593Smuzhiyun goto out_free;
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun baudrate_data = cpu_to_le32(device_baudrate);
890*4882a593Smuzhiyun skb = __hci_cmd_sync(h5->hu->hdev, 0xfc17, sizeof(baudrate_data),
891*4882a593Smuzhiyun &baudrate_data, HCI_INIT_TIMEOUT);
892*4882a593Smuzhiyun if (IS_ERR(skb)) {
893*4882a593Smuzhiyun rtl_dev_err(h5->hu->hdev, "set baud rate command failed\n");
894*4882a593Smuzhiyun err = PTR_ERR(skb);
895*4882a593Smuzhiyun goto out_free;
896*4882a593Smuzhiyun } else {
897*4882a593Smuzhiyun kfree_skb(skb);
898*4882a593Smuzhiyun }
899*4882a593Smuzhiyun /* Give the device some time to set up the new baudrate. */
900*4882a593Smuzhiyun usleep_range(10000, 20000);
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun serdev_device_set_baudrate(h5->hu->serdev, controller_baudrate);
903*4882a593Smuzhiyun serdev_device_set_flow_control(h5->hu->serdev, flow_control);
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun err = btrtl_download_firmware(h5->hu->hdev, btrtl_dev);
906*4882a593Smuzhiyun /* Give the device some time before the hci-core sends it a reset */
907*4882a593Smuzhiyun usleep_range(10000, 20000);
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun /* Enable controller to do both LE scan and BR/EDR inquiry
910*4882a593Smuzhiyun * simultaneously.
911*4882a593Smuzhiyun */
912*4882a593Smuzhiyun set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &h5->hu->hdev->quirks);
913*4882a593Smuzhiyun
914*4882a593Smuzhiyun out_free:
915*4882a593Smuzhiyun btrtl_free(btrtl_dev);
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun return err;
918*4882a593Smuzhiyun }
919*4882a593Smuzhiyun
h5_btrtl_open(struct h5 * h5)920*4882a593Smuzhiyun static void h5_btrtl_open(struct h5 *h5)
921*4882a593Smuzhiyun {
922*4882a593Smuzhiyun /* Devices always start with these fixed parameters */
923*4882a593Smuzhiyun serdev_device_set_flow_control(h5->hu->serdev, false);
924*4882a593Smuzhiyun serdev_device_set_parity(h5->hu->serdev, SERDEV_PARITY_EVEN);
925*4882a593Smuzhiyun serdev_device_set_baudrate(h5->hu->serdev, 115200);
926*4882a593Smuzhiyun
927*4882a593Smuzhiyun /* The controller needs up to 500ms to wakeup */
928*4882a593Smuzhiyun gpiod_set_value_cansleep(h5->enable_gpio, 1);
929*4882a593Smuzhiyun gpiod_set_value_cansleep(h5->device_wake_gpio, 1);
930*4882a593Smuzhiyun msleep(500);
931*4882a593Smuzhiyun }
932*4882a593Smuzhiyun
h5_btrtl_close(struct h5 * h5)933*4882a593Smuzhiyun static void h5_btrtl_close(struct h5 *h5)
934*4882a593Smuzhiyun {
935*4882a593Smuzhiyun gpiod_set_value_cansleep(h5->device_wake_gpio, 0);
936*4882a593Smuzhiyun gpiod_set_value_cansleep(h5->enable_gpio, 0);
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun /* Suspend/resume support. On many devices the RTL BT device loses power during
940*4882a593Smuzhiyun * suspend/resume, causing it to lose its firmware and all state. So we simply
941*4882a593Smuzhiyun * turn it off on suspend and reprobe on resume. This mirrors how RTL devices
942*4882a593Smuzhiyun * are handled in the USB driver, where the USB_QUIRK_RESET_RESUME is used which
943*4882a593Smuzhiyun * also causes a reprobe on resume.
944*4882a593Smuzhiyun */
h5_btrtl_suspend(struct h5 * h5)945*4882a593Smuzhiyun static int h5_btrtl_suspend(struct h5 *h5)
946*4882a593Smuzhiyun {
947*4882a593Smuzhiyun serdev_device_set_flow_control(h5->hu->serdev, false);
948*4882a593Smuzhiyun gpiod_set_value_cansleep(h5->device_wake_gpio, 0);
949*4882a593Smuzhiyun gpiod_set_value_cansleep(h5->enable_gpio, 0);
950*4882a593Smuzhiyun return 0;
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun struct h5_btrtl_reprobe {
954*4882a593Smuzhiyun struct device *dev;
955*4882a593Smuzhiyun struct work_struct work;
956*4882a593Smuzhiyun };
957*4882a593Smuzhiyun
h5_btrtl_reprobe_worker(struct work_struct * work)958*4882a593Smuzhiyun static void h5_btrtl_reprobe_worker(struct work_struct *work)
959*4882a593Smuzhiyun {
960*4882a593Smuzhiyun struct h5_btrtl_reprobe *reprobe =
961*4882a593Smuzhiyun container_of(work, struct h5_btrtl_reprobe, work);
962*4882a593Smuzhiyun int ret;
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun ret = device_reprobe(reprobe->dev);
965*4882a593Smuzhiyun if (ret && ret != -EPROBE_DEFER)
966*4882a593Smuzhiyun dev_err(reprobe->dev, "Reprobe error %d\n", ret);
967*4882a593Smuzhiyun
968*4882a593Smuzhiyun put_device(reprobe->dev);
969*4882a593Smuzhiyun kfree(reprobe);
970*4882a593Smuzhiyun module_put(THIS_MODULE);
971*4882a593Smuzhiyun }
972*4882a593Smuzhiyun
h5_btrtl_resume(struct h5 * h5)973*4882a593Smuzhiyun static int h5_btrtl_resume(struct h5 *h5)
974*4882a593Smuzhiyun {
975*4882a593Smuzhiyun struct h5_btrtl_reprobe *reprobe;
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun reprobe = kzalloc(sizeof(*reprobe), GFP_KERNEL);
978*4882a593Smuzhiyun if (!reprobe)
979*4882a593Smuzhiyun return -ENOMEM;
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun __module_get(THIS_MODULE);
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun INIT_WORK(&reprobe->work, h5_btrtl_reprobe_worker);
984*4882a593Smuzhiyun reprobe->dev = get_device(&h5->hu->serdev->dev);
985*4882a593Smuzhiyun queue_work(system_long_wq, &reprobe->work);
986*4882a593Smuzhiyun return 0;
987*4882a593Smuzhiyun }
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun static const struct acpi_gpio_params btrtl_device_wake_gpios = { 0, 0, false };
990*4882a593Smuzhiyun static const struct acpi_gpio_params btrtl_enable_gpios = { 1, 0, false };
991*4882a593Smuzhiyun static const struct acpi_gpio_params btrtl_host_wake_gpios = { 2, 0, false };
992*4882a593Smuzhiyun static const struct acpi_gpio_mapping acpi_btrtl_gpios[] = {
993*4882a593Smuzhiyun { "device-wake-gpios", &btrtl_device_wake_gpios, 1 },
994*4882a593Smuzhiyun { "enable-gpios", &btrtl_enable_gpios, 1 },
995*4882a593Smuzhiyun { "host-wake-gpios", &btrtl_host_wake_gpios, 1 },
996*4882a593Smuzhiyun {},
997*4882a593Smuzhiyun };
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun static struct h5_vnd rtl_vnd = {
1000*4882a593Smuzhiyun .setup = h5_btrtl_setup,
1001*4882a593Smuzhiyun .open = h5_btrtl_open,
1002*4882a593Smuzhiyun .close = h5_btrtl_close,
1003*4882a593Smuzhiyun .suspend = h5_btrtl_suspend,
1004*4882a593Smuzhiyun .resume = h5_btrtl_resume,
1005*4882a593Smuzhiyun .acpi_gpio_map = acpi_btrtl_gpios,
1006*4882a593Smuzhiyun };
1007*4882a593Smuzhiyun #endif
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun #ifdef CONFIG_ACPI
1010*4882a593Smuzhiyun static const struct acpi_device_id h5_acpi_match[] = {
1011*4882a593Smuzhiyun #ifdef CONFIG_BT_HCIUART_RTL
1012*4882a593Smuzhiyun { "OBDA8723", (kernel_ulong_t)&rtl_vnd },
1013*4882a593Smuzhiyun #endif
1014*4882a593Smuzhiyun { },
1015*4882a593Smuzhiyun };
1016*4882a593Smuzhiyun MODULE_DEVICE_TABLE(acpi, h5_acpi_match);
1017*4882a593Smuzhiyun #endif
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun static const struct dev_pm_ops h5_serdev_pm_ops = {
1020*4882a593Smuzhiyun SET_SYSTEM_SLEEP_PM_OPS(h5_serdev_suspend, h5_serdev_resume)
1021*4882a593Smuzhiyun };
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun static const struct of_device_id rtl_bluetooth_of_match[] = {
1024*4882a593Smuzhiyun #ifdef CONFIG_BT_HCIUART_RTL
1025*4882a593Smuzhiyun { .compatible = "realtek,rtl8822cs-bt",
1026*4882a593Smuzhiyun .data = (const void *)&rtl_vnd },
1027*4882a593Smuzhiyun { .compatible = "realtek,rtl8723bs-bt",
1028*4882a593Smuzhiyun .data = (const void *)&rtl_vnd },
1029*4882a593Smuzhiyun #endif
1030*4882a593Smuzhiyun { },
1031*4882a593Smuzhiyun };
1032*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rtl_bluetooth_of_match);
1033*4882a593Smuzhiyun
1034*4882a593Smuzhiyun static struct serdev_device_driver h5_serdev_driver = {
1035*4882a593Smuzhiyun .probe = h5_serdev_probe,
1036*4882a593Smuzhiyun .remove = h5_serdev_remove,
1037*4882a593Smuzhiyun .driver = {
1038*4882a593Smuzhiyun .name = "hci_uart_h5",
1039*4882a593Smuzhiyun .acpi_match_table = ACPI_PTR(h5_acpi_match),
1040*4882a593Smuzhiyun .pm = &h5_serdev_pm_ops,
1041*4882a593Smuzhiyun .of_match_table = rtl_bluetooth_of_match,
1042*4882a593Smuzhiyun },
1043*4882a593Smuzhiyun };
1044*4882a593Smuzhiyun
h5_init(void)1045*4882a593Smuzhiyun int __init h5_init(void)
1046*4882a593Smuzhiyun {
1047*4882a593Smuzhiyun serdev_device_driver_register(&h5_serdev_driver);
1048*4882a593Smuzhiyun return hci_uart_register_proto(&h5p);
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
h5_deinit(void)1051*4882a593Smuzhiyun int __exit h5_deinit(void)
1052*4882a593Smuzhiyun {
1053*4882a593Smuzhiyun serdev_device_driver_unregister(&h5_serdev_driver);
1054*4882a593Smuzhiyun return hci_uart_unregister_proto(&h5p);
1055*4882a593Smuzhiyun }
1056