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 driver.
28 * $Id: hci_ldisc.c,v 1.5 2002/10/02 18:37:20 maxk Exp $
32 #include <linux/config.h>
33 #include <linux/module.h>
35 #include <linux/version.h>
36 #include <linux/kernel.h>
37 #include <linux/init.h>
38 #include <linux/sched.h>
39 #include <linux/types.h>
40 #include <linux/fcntl.h>
41 #include <linux/interrupt.h>
42 #include <linux/ptrace.h>
43 #include <linux/poll.h>
45 #include <linux/slab.h>
46 #include <linux/tty.h>
47 #include <linux/errno.h>
48 #include <linux/string.h>
49 #include <linux/signal.h>
50 #include <linux/ioctl.h>
51 #include <linux/skbuff.h>
53 #include <net/bluetooth/bluetooth.h>
54 #include <net/bluetooth/hci_core.h>
57 #ifndef HCI_UART_DEBUG
59 #define BT_DBG( A... )
61 #define BT_DMP( A... )
64 static struct hci_uart_proto *hup[HCI_UART_MAX_PROTO];
66 int hci_uart_register_proto(struct hci_uart_proto *p)
68 if (p->id >= HCI_UART_MAX_PROTO)
78 int hci_uart_unregister_proto(struct hci_uart_proto *p)
80 if (p->id >= HCI_UART_MAX_PROTO)
90 static struct hci_uart_proto *hci_uart_get_proto(unsigned int id)
92 if (id >= HCI_UART_MAX_PROTO)
97 static inline void hci_uart_tx_complete(struct hci_uart *hu, int pkt_type)
99 struct hci_dev *hdev = &hu->hdev;
101 /* Update HCI stat counters */
103 case HCI_COMMAND_PKT:
107 case HCI_ACLDATA_PKT:
111 case HCI_SCODATA_PKT:
117 static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)
119 struct sk_buff *skb = hu->tx_skb;
121 skb = hu->proto->dequeue(hu);
127 int hci_uart_tx_wakeup(struct hci_uart *hu)
129 struct tty_struct *tty = hu->tty;
130 struct hci_dev *hdev = &hu->hdev;
133 if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) {
134 set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
141 clear_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
143 while ((skb = hci_uart_dequeue(hu))) {
146 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
147 len = tty->driver.write(tty, 0, skb->data, skb->len);
148 hdev->stat.byte_tx += len;
156 hci_uart_tx_complete(hu, skb->pkt_type);
160 if (test_bit(HCI_UART_TX_WAKEUP, &hu->tx_state))
163 clear_bit(HCI_UART_SENDING, &hu->tx_state);
167 /* ------- Interface to HCI layer ------ */
168 /* Initialize device */
169 static int hci_uart_open(struct hci_dev *hdev)
171 BT_DBG("%s %p", hdev->name, hdev);
173 /* Nothing to do for UART driver */
175 set_bit(HCI_RUNNING, &hdev->flags);
180 static int hci_uart_flush(struct hci_dev *hdev)
182 struct hci_uart *hu = (struct hci_uart *) hdev->driver_data;
183 struct tty_struct *tty = hu->tty;
185 BT_DBG("hdev %p tty %p", hdev, tty);
188 kfree_skb(hu->tx_skb); hu->tx_skb = NULL;
191 tty_ldisc_flush(tty);
193 if (tty->driver.flush_buffer)
194 tty->driver.flush_buffer(tty);
196 if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
197 hu->proto->flush(hu);
203 static int hci_uart_close(struct hci_dev *hdev)
205 BT_DBG("hdev %p", hdev);
207 if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
210 hci_uart_flush(hdev);
214 /* Send frames from HCI layer */
215 static int hci_uart_send_frame(struct sk_buff *skb)
217 struct hci_dev* hdev = (struct hci_dev *) skb->dev;
218 struct tty_struct *tty;
222 BT_ERR("Frame for uknown device (hdev=NULL)");
226 if (!test_bit(HCI_RUNNING, &hdev->flags))
229 hu = (struct hci_uart *) hdev->driver_data;
232 BT_DBG("%s: type %d len %d", hdev->name, skb->pkt_type, skb->len);
234 hu->proto->enqueue(hu, skb);
236 hci_uart_tx_wakeup(hu);
240 static void hci_uart_destruct(struct hci_dev *hdev)
246 BT_DBG("%s", hdev->name);
248 hu = (struct hci_uart *) hdev->driver_data;
254 /* ------ LDISC part ------ */
257 * Called when line discipline changed to HCI_UART.
260 * tty pointer to tty info structure
262 * 0 if success, otherwise error code
264 static int hci_uart_tty_open(struct tty_struct *tty)
266 struct hci_uart *hu = (void *) tty->disc_data;
268 BT_DBG("tty %p", tty);
273 if (!(hu = kmalloc(sizeof(struct hci_uart), GFP_KERNEL))) {
274 BT_ERR("Can't allocate controll structure");
277 memset(hu, 0, sizeof(struct hci_uart));
282 spin_lock_init(&hu->rx_lock);
284 /* Flush any pending characters in the driver and line discipline. */
285 /* FIXME: why is this needed. Note don't use ldisc_ref here as the
286 open path is before the ldisc is referencable */
287 tty_ldisc_flush(tty);
289 if (tty->driver.flush_buffer)
290 tty->driver.flush_buffer(tty);
296 /* hci_uart_tty_close()
298 * Called when the line discipline is changed to something
299 * else, the tty is closed, or the tty detects a hangup.
301 static void hci_uart_tty_close(struct tty_struct *tty)
303 struct hci_uart *hu = (void *)tty->disc_data;
305 BT_DBG("tty %p", tty);
307 /* Detach from the tty */
308 tty->disc_data = NULL;
311 struct hci_dev *hdev = &hu->hdev;
312 hci_uart_close(hdev);
314 if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
315 hu->proto->close(hu);
316 hci_unregister_dev(hdev);
323 /* hci_uart_tty_wakeup()
325 * Callback for transmit wakeup. Called when low level
326 * device driver can accept more send data.
328 * Arguments: tty pointer to associated tty instance data
331 static void hci_uart_tty_wakeup(struct tty_struct *tty)
333 struct hci_uart *hu = (void *)tty->disc_data;
340 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
345 if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
346 hci_uart_tx_wakeup(hu);
349 /* hci_uart_tty_room()
351 * Callback function from tty driver. Return the amount of
352 * space left in the receiver's buffer to decide if remote
353 * transmitter is to be throttled.
355 * Arguments: tty pointer to associated tty instance data
356 * Return Value: number of bytes left in receive buffer
358 static int hci_uart_tty_room (struct tty_struct *tty)
363 /* hci_uart_tty_receive()
365 * Called by tty low level driver when receive data is
368 * Arguments: tty pointer to tty isntance data
369 * data pointer to received data
370 * flags pointer to flags for data
371 * count count of received data in bytes
375 static void hci_uart_tty_receive(struct tty_struct *tty, const __u8 *data, char *flags, int count)
377 struct hci_uart *hu = (void *)tty->disc_data;
379 if (!hu || tty != hu->tty)
382 if (!test_bit(HCI_UART_PROTO_SET, &hu->flags))
385 spin_lock(&hu->rx_lock);
386 hu->proto->recv(hu, (void *) data, count);
387 hu->hdev.stat.byte_rx += count;
388 spin_unlock(&hu->rx_lock);
390 if (test_and_clear_bit(TTY_THROTTLED,&tty->flags) && tty->driver.unthrottle)
391 tty->driver.unthrottle(tty);
394 static int hci_uart_register_dev(struct hci_uart *hu)
396 struct hci_dev *hdev;
400 /* Initialize and register HCI device */
403 hdev->type = HCI_UART;
404 hdev->driver_data = hu;
406 hdev->open = hci_uart_open;
407 hdev->close = hci_uart_close;
408 hdev->flush = hci_uart_flush;
409 hdev->send = hci_uart_send_frame;
410 hdev->destruct = hci_uart_destruct;
412 if (hci_register_dev(hdev) < 0) {
413 BT_ERR("Can't register HCI device %s", hdev->name);
420 static int hci_uart_set_proto(struct hci_uart *hu, int id)
422 struct hci_uart_proto *p;
425 p = hci_uart_get_proto(id);
427 return -EPROTONOSUPPORT;
435 err = hci_uart_register_dev(hu);
443 /* hci_uart_tty_ioctl()
445 * Process IOCTL system call for the tty device.
449 * tty pointer to tty instance data
450 * file pointer to open file object for device
451 * cmd IOCTL command code
452 * arg argument for IOCTL call (cmd dependent)
454 * Return Value: Command dependent
456 static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file * file,
457 unsigned int cmd, unsigned long arg)
459 struct hci_uart *hu = (void *)tty->disc_data;
464 /* Verify the status of the device */
469 case HCIUARTSETPROTO:
470 if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
471 err = hci_uart_set_proto(hu, arg);
473 clear_bit(HCI_UART_PROTO_SET, &hu->flags);
476 tty->low_latency = 1;
480 case HCIUARTGETPROTO:
481 if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
482 return hu->proto->id;
486 err = n_tty_ioctl(tty, file, cmd, arg);
494 * We don't provide read/write/poll interface for user space.
496 static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file, unsigned char *buf, size_t nr)
500 static ssize_t hci_uart_tty_write(struct tty_struct *tty, struct file *file, const unsigned char *data, size_t count)
504 static unsigned int hci_uart_tty_poll(struct tty_struct *tty, struct file *filp, poll_table *wait)
509 #ifdef CONFIG_BLUEZ_HCIUART_H4
513 #ifdef CONFIG_BLUEZ_HCIUART_BCSP
515 int bcsp_deinit(void);
518 int __init hci_uart_init(void)
520 static struct tty_ldisc hci_uart_ldisc;
523 BT_INFO("BlueZ HCI UART driver ver %s Copyright (C) 2000,2001 Qualcomm Inc",
525 BT_INFO("Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>");
527 /* Register the tty discipline */
529 memset(&hci_uart_ldisc, 0, sizeof (hci_uart_ldisc));
530 hci_uart_ldisc.magic = TTY_LDISC_MAGIC;
531 hci_uart_ldisc.name = "n_hci";
532 hci_uart_ldisc.open = hci_uart_tty_open;
533 hci_uart_ldisc.close = hci_uart_tty_close;
534 hci_uart_ldisc.read = hci_uart_tty_read;
535 hci_uart_ldisc.write = hci_uart_tty_write;
536 hci_uart_ldisc.ioctl = hci_uart_tty_ioctl;
537 hci_uart_ldisc.poll = hci_uart_tty_poll;
538 hci_uart_ldisc.receive_room= hci_uart_tty_room;
539 hci_uart_ldisc.receive_buf = hci_uart_tty_receive;
540 hci_uart_ldisc.write_wakeup= hci_uart_tty_wakeup;
542 if ((err = tty_register_ldisc(N_HCI, &hci_uart_ldisc))) {
543 BT_ERR("Can't register HCI line discipline (%d)", err);
547 #ifdef CONFIG_BLUEZ_HCIUART_H4
550 #ifdef CONFIG_BLUEZ_HCIUART_BCSP
557 void hci_uart_cleanup(void)
561 #ifdef CONFIG_BLUEZ_HCIUART_H4
564 #ifdef CONFIG_BLUEZ_HCIUART_BCSP
568 /* Release tty registration of line discipline */
569 if ((err = tty_register_ldisc(N_HCI, NULL)))
570 BT_ERR("Can't unregister HCI line discipline (%d)", err);
573 module_init(hci_uart_init);
574 module_exit(hci_uart_cleanup);
576 MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>");
577 MODULE_DESCRIPTION("BlueZ HCI UART driver ver " VERSION);
578 MODULE_LICENSE("GPL");