3 * Bluetooth HCI UART driver
5 * Copyright (C) 2000-2001 Qualcomm Incorporated
6 * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
7 * Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <linux/module.h>
28 #include <linux/kernel.h>
29 #include <linux/init.h>
30 #include <linux/types.h>
31 #include <linux/fcntl.h>
32 #include <linux/interrupt.h>
33 #include <linux/ptrace.h>
34 #include <linux/poll.h>
36 #include <linux/slab.h>
37 #include <linux/tty.h>
38 #include <linux/errno.h>
39 #include <linux/string.h>
40 #include <linux/signal.h>
41 #include <linux/ioctl.h>
42 #include <linux/skbuff.h>
44 #include <net/bluetooth/bluetooth.h>
45 #include <net/bluetooth/hci_core.h>
50 struct sk_buff
*rx_skb
;
51 struct sk_buff_head txq
;
54 /* Initialize protocol */
55 static int h4_open(struct hci_uart
*hu
)
61 h4
= kzalloc(sizeof(*h4
), GFP_KERNEL
);
65 skb_queue_head_init(&h4
->txq
);
71 /* Flush protocol data */
72 static int h4_flush(struct hci_uart
*hu
)
74 struct h4_struct
*h4
= hu
->priv
;
78 skb_queue_purge(&h4
->txq
);
84 static int h4_close(struct hci_uart
*hu
)
86 struct h4_struct
*h4
= hu
->priv
;
92 skb_queue_purge(&h4
->txq
);
94 kfree_skb(h4
->rx_skb
);
102 /* Enqueue frame for transmittion (padding, crc, etc) */
103 static int h4_enqueue(struct hci_uart
*hu
, struct sk_buff
*skb
)
105 struct h4_struct
*h4
= hu
->priv
;
107 BT_DBG("hu %p skb %p", hu
, skb
);
109 /* Prepend skb with frame type */
110 memcpy(skb_push(skb
, 1), &bt_cb(skb
)->pkt_type
, 1);
111 skb_queue_tail(&h4
->txq
, skb
);
117 static int h4_recv(struct hci_uart
*hu
, const void *data
, int count
)
119 struct h4_struct
*h4
= hu
->priv
;
121 if (!test_bit(HCI_UART_REGISTERED
, &hu
->flags
))
124 h4
->rx_skb
= h4_recv_buf(hu
->hdev
, h4
->rx_skb
, data
, count
);
125 if (IS_ERR(h4
->rx_skb
)) {
126 int err
= PTR_ERR(h4
->rx_skb
);
127 BT_ERR("%s: Frame reassembly failed (%d)", hu
->hdev
->name
, err
);
134 static struct sk_buff
*h4_dequeue(struct hci_uart
*hu
)
136 struct h4_struct
*h4
= hu
->priv
;
137 return skb_dequeue(&h4
->txq
);
140 static const struct hci_uart_proto h4p
= {
146 .enqueue
= h4_enqueue
,
147 .dequeue
= h4_dequeue
,
151 int __init
h4_init(void)
153 return hci_uart_register_proto(&h4p
);
156 int __exit
h4_deinit(void)
158 return hci_uart_unregister_proto(&h4p
);
161 struct sk_buff
*h4_recv_buf(struct hci_dev
*hdev
, struct sk_buff
*skb
,
162 const unsigned char *buffer
, int count
)
169 case HCI_ACLDATA_PKT
:
170 skb
= bt_skb_alloc(HCI_MAX_FRAME_SIZE
,
173 return ERR_PTR(-ENOMEM
);
175 bt_cb(skb
)->pkt_type
= HCI_ACLDATA_PKT
;
176 bt_cb(skb
)->expect
= HCI_ACL_HDR_SIZE
;
178 case HCI_SCODATA_PKT
:
179 skb
= bt_skb_alloc(HCI_MAX_SCO_SIZE
,
182 return ERR_PTR(-ENOMEM
);
184 bt_cb(skb
)->pkt_type
= HCI_SCODATA_PKT
;
185 bt_cb(skb
)->expect
= HCI_SCO_HDR_SIZE
;
188 skb
= bt_skb_alloc(HCI_MAX_EVENT_SIZE
,
191 return ERR_PTR(-ENOMEM
);
193 bt_cb(skb
)->pkt_type
= HCI_EVENT_PKT
;
194 bt_cb(skb
)->expect
= HCI_EVENT_HDR_SIZE
;
197 return ERR_PTR(-EILSEQ
);
204 len
= min_t(uint
, bt_cb(skb
)->expect
, count
);
205 memcpy(skb_put(skb
, len
), buffer
, len
);
209 bt_cb(skb
)->expect
-= len
;
211 switch (bt_cb(skb
)->pkt_type
) {
212 case HCI_ACLDATA_PKT
:
213 if (skb
->len
== HCI_ACL_HDR_SIZE
) {
214 __le16 dlen
= hci_acl_hdr(skb
)->dlen
;
216 /* Complete ACL header */
217 bt_cb(skb
)->expect
= __le16_to_cpu(dlen
);
219 if (skb_tailroom(skb
) < bt_cb(skb
)->expect
) {
221 return ERR_PTR(-EMSGSIZE
);
225 case HCI_SCODATA_PKT
:
226 if (skb
->len
== HCI_SCO_HDR_SIZE
) {
227 /* Complete SCO header */
228 bt_cb(skb
)->expect
= hci_sco_hdr(skb
)->dlen
;
230 if (skb_tailroom(skb
) < bt_cb(skb
)->expect
) {
232 return ERR_PTR(-EMSGSIZE
);
237 if (skb
->len
== HCI_EVENT_HDR_SIZE
) {
238 /* Complete event header */
239 bt_cb(skb
)->expect
= hci_event_hdr(skb
)->plen
;
241 if (skb_tailroom(skb
) < bt_cb(skb
)->expect
) {
243 return ERR_PTR(-EMSGSIZE
);
249 if (bt_cb(skb
)->expect
== 0) {
251 hci_recv_frame(hdev
, skb
);