2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
26 * BlueZ HCI UART(H4) protocol.
28 * $Id: hci_h4.c,v 1.1.1.1 2005/04/11 02:50:17 jack Exp $
32 #include <linux/config.h>
33 #include <linux/module.h>
35 #include <linux/version.h>
36 #include <linux/config.h>
37 #include <linux/kernel.h>
38 #include <linux/init.h>
39 #include <linux/sched.h>
40 #include <linux/types.h>
41 #include <linux/fcntl.h>
42 #include <linux/interrupt.h>
43 #include <linux/ptrace.h>
44 #include <linux/poll.h>
46 #include <linux/slab.h>
47 #include <linux/tty.h>
48 #include <linux/errno.h>
49 #include <linux/string.h>
50 #include <linux/signal.h>
51 #include <linux/ioctl.h>
52 #include <linux/skbuff.h>
54 #include <net/bluetooth/bluetooth.h>
55 #include <net/bluetooth/hci_core.h>
59 #ifndef HCI_UART_DEBUG
61 #define BT_DBG( A... )
63 #define BT_DMP( A... )
66 /* Initialize protocol */
67 static int h4_open(struct hci_uart *hu)
73 h4 = kmalloc(sizeof(*h4), GFP_ATOMIC);
76 memset(h4, 0, sizeof(*h4));
78 skb_queue_head_init(&h4->txq);
84 /* Flush protocol data */
85 static int h4_flush(struct hci_uart *hu)
87 struct h4_struct *h4 = hu->priv;
90 skb_queue_purge(&h4->txq);
95 static int h4_close(struct hci_uart *hu)
97 struct h4_struct *h4 = hu->priv;
102 skb_queue_purge(&h4->txq);
104 kfree_skb(h4->rx_skb);
111 /* Enqueue frame for transmittion (padding, crc, etc) */
112 static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb)
114 struct h4_struct *h4 = hu->priv;
116 BT_DBG("hu %p skb %p", hu, skb);
118 /* Prepend skb with frame type */
119 memcpy(skb_push(skb, 1), &skb->pkt_type, 1);
120 skb_queue_tail(&h4->txq, skb);
124 static inline int h4_check_data_len(struct h4_struct *h4, int len)
126 register int room = skb_tailroom(h4->rx_skb);
128 BT_DBG("len %d room %d", len, room);
130 BT_DMP(h4->rx_skb->data, h4->rx_skb->len);
131 hci_recv_frame(h4->rx_skb);
132 } else if (len > room) {
133 BT_ERR("Data length is too large");
134 kfree_skb(h4->rx_skb);
136 h4->rx_state = H4_W4_DATA;
141 h4->rx_state = H4_W4_PACKET_TYPE;
148 static int h4_recv(struct hci_uart *hu, void *data, int count)
150 struct h4_struct *h4 = hu->priv;
155 register int len, type, dlen;
157 BT_DBG("hu %p count %d rx_state %ld rx_count %ld",
158 hu, count, h4->rx_state, h4->rx_count);
163 len = MIN(h4->rx_count, count);
164 memcpy(skb_put(h4->rx_skb, len), ptr, len);
165 h4->rx_count -= len; count -= len; ptr += len;
170 switch (h4->rx_state) {
172 BT_DBG("Complete data");
174 BT_DMP(h4->rx_skb->data, h4->rx_skb->len);
176 hci_recv_frame(h4->rx_skb);
178 h4->rx_state = H4_W4_PACKET_TYPE;
182 case H4_W4_EVENT_HDR:
183 eh = (hci_event_hdr *) h4->rx_skb->data;
185 BT_DBG("Event header: evt 0x%2.2x plen %d", eh->evt, eh->plen);
187 h4_check_data_len(h4, eh->plen);
191 ah = (hci_acl_hdr *) h4->rx_skb->data;
192 dlen = __le16_to_cpu(ah->dlen);
194 BT_DBG("ACL header: dlen %d", dlen);
196 h4_check_data_len(h4, dlen);
200 sh = (hci_sco_hdr *) h4->rx_skb->data;
202 BT_DBG("SCO header: dlen %d", sh->dlen);
204 h4_check_data_len(h4, sh->dlen);
209 /* H4_W4_PACKET_TYPE */
212 BT_DBG("Event packet");
213 h4->rx_state = H4_W4_EVENT_HDR;
214 h4->rx_count = HCI_EVENT_HDR_SIZE;
215 type = HCI_EVENT_PKT;
218 case HCI_ACLDATA_PKT:
219 BT_DBG("ACL packet");
220 h4->rx_state = H4_W4_ACL_HDR;
221 h4->rx_count = HCI_ACL_HDR_SIZE;
222 type = HCI_ACLDATA_PKT;
225 case HCI_SCODATA_PKT:
226 BT_DBG("SCO packet");
227 h4->rx_state = H4_W4_SCO_HDR;
228 h4->rx_count = HCI_SCO_HDR_SIZE;
229 type = HCI_SCODATA_PKT;
233 BT_ERR("Unknown HCI packet type %2.2x", (__u8)*ptr);
234 hu->hdev.stat.err_rx++;
240 /* Allocate packet */
241 h4->rx_skb = bluez_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
243 BT_ERR("Can't allocate mem for new packet");
244 h4->rx_state = H4_W4_PACKET_TYPE;
248 h4->rx_skb->dev = (void *) &hu->hdev;
249 h4->rx_skb->pkt_type = type;
254 static struct sk_buff *h4_dequeue(struct hci_uart *hu)
256 struct h4_struct *h4 = hu->priv;
257 return skb_dequeue(&h4->txq);
260 static struct hci_uart_proto h4p = {
272 return hci_uart_register_proto(&h4p);
277 return hci_uart_unregister_proto(&h4p);