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 * Bluetooth 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/kernel.h>
36 #include <linux/init.h>
37 #include <linux/sched.h>
38 #include <linux/types.h>
39 #include <linux/fcntl.h>
40 #include <linux/interrupt.h>
41 #include <linux/ptrace.h>
42 #include <linux/poll.h>
44 #include <linux/slab.h>
45 #include <linux/tty.h>
46 #include <linux/errno.h>
47 #include <linux/string.h>
48 #include <linux/signal.h>
49 #include <linux/ioctl.h>
50 #include <linux/skbuff.h>
52 #include <net/bluetooth/bluetooth.h>
53 #include <net/bluetooth/hci_core.h>
57 #ifndef CONFIG_BT_HCIUART_DEBUG
59 #define BT_DBG( A... )
61 #define BT_DMP( A... )
66 static struct hci_uart_proto
*hup
[HCI_UART_MAX_PROTO
];
68 int hci_uart_register_proto(struct hci_uart_proto
*p
)
70 if (p
->id
>= HCI_UART_MAX_PROTO
)
80 int hci_uart_unregister_proto(struct hci_uart_proto
*p
)
82 if (p
->id
>= HCI_UART_MAX_PROTO
)
92 static struct hci_uart_proto
*hci_uart_get_proto(unsigned int id
)
94 if (id
>= HCI_UART_MAX_PROTO
)
99 static inline void hci_uart_tx_complete(struct hci_uart
*hu
, int pkt_type
)
101 struct hci_dev
*hdev
= hu
->hdev
;
103 /* Update HCI stat counters */
105 case HCI_COMMAND_PKT
:
109 case HCI_ACLDATA_PKT
:
113 case HCI_SCODATA_PKT
:
119 static inline struct sk_buff
*hci_uart_dequeue(struct hci_uart
*hu
)
121 struct sk_buff
*skb
= hu
->tx_skb
;
123 skb
= hu
->proto
->dequeue(hu
);
129 int hci_uart_tx_wakeup(struct hci_uart
*hu
)
131 struct tty_struct
*tty
= hu
->tty
;
132 struct hci_dev
*hdev
= hu
->hdev
;
135 if (test_and_set_bit(HCI_UART_SENDING
, &hu
->tx_state
)) {
136 set_bit(HCI_UART_TX_WAKEUP
, &hu
->tx_state
);
143 clear_bit(HCI_UART_TX_WAKEUP
, &hu
->tx_state
);
145 while ((skb
= hci_uart_dequeue(hu
))) {
148 set_bit(TTY_DO_WRITE_WAKEUP
, &tty
->flags
);
149 len
= tty
->driver
->write(tty
, skb
->data
, skb
->len
);
150 hdev
->stat
.byte_tx
+= len
;
158 hci_uart_tx_complete(hu
, skb
->pkt_type
);
162 if (test_bit(HCI_UART_TX_WAKEUP
, &hu
->tx_state
))
165 clear_bit(HCI_UART_SENDING
, &hu
->tx_state
);
169 /* ------- Interface to HCI layer ------ */
170 /* Initialize device */
171 static int hci_uart_open(struct hci_dev
*hdev
)
173 BT_DBG("%s %p", hdev
->name
, hdev
);
175 /* Nothing to do for UART driver */
177 set_bit(HCI_RUNNING
, &hdev
->flags
);
182 static int hci_uart_flush(struct hci_dev
*hdev
)
184 struct hci_uart
*hu
= (struct hci_uart
*) hdev
->driver_data
;
185 struct tty_struct
*tty
= hu
->tty
;
187 BT_DBG("hdev %p tty %p", hdev
, tty
);
190 kfree_skb(hu
->tx_skb
); hu
->tx_skb
= NULL
;
193 /* Flush any pending characters in the driver and discipline. */
194 tty_ldisc_flush(tty
);
195 if (tty
->driver
->flush_buffer
)
196 tty
->driver
->flush_buffer(tty
);
198 if (test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
199 hu
->proto
->flush(hu
);
205 static int hci_uart_close(struct hci_dev
*hdev
)
207 BT_DBG("hdev %p", hdev
);
209 if (!test_and_clear_bit(HCI_RUNNING
, &hdev
->flags
))
212 hci_uart_flush(hdev
);
216 /* Send frames from HCI layer */
217 static int hci_uart_send_frame(struct sk_buff
*skb
)
219 struct hci_dev
* hdev
= (struct hci_dev
*) skb
->dev
;
220 struct tty_struct
*tty
;
224 BT_ERR("Frame for uknown device (hdev=NULL)");
228 if (!test_bit(HCI_RUNNING
, &hdev
->flags
))
231 hu
= (struct hci_uart
*) hdev
->driver_data
;
234 BT_DBG("%s: type %d len %d", hdev
->name
, skb
->pkt_type
, skb
->len
);
236 hu
->proto
->enqueue(hu
, skb
);
238 hci_uart_tx_wakeup(hu
);
242 static void hci_uart_destruct(struct hci_dev
*hdev
)
248 BT_DBG("%s", hdev
->name
);
250 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 if (tty
->ldisc
.flush_buffer
)
288 tty
->ldisc
.flush_buffer(tty
);
290 if (tty
->driver
->flush_buffer
)
291 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
);
322 /* hci_uart_tty_wakeup()
324 * Callback for transmit wakeup. Called when low level
325 * device driver can accept more send data.
327 * Arguments: tty pointer to associated tty instance data
330 static void hci_uart_tty_wakeup(struct tty_struct
*tty
)
332 struct hci_uart
*hu
= (void *)tty
->disc_data
;
339 clear_bit(TTY_DO_WRITE_WAKEUP
, &tty
->flags
);
344 if (test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
345 hci_uart_tx_wakeup(hu
);
348 /* hci_uart_tty_room()
350 * Callback function from tty driver. Return the amount of
351 * space left in the receiver's buffer to decide if remote
352 * transmitter is to be throttled.
354 * Arguments: tty pointer to associated tty instance data
355 * Return Value: number of bytes left in receive buffer
357 static int hci_uart_tty_room (struct tty_struct
*tty
)
362 /* hci_uart_tty_receive()
364 * Called by tty low level driver when receive data is
367 * Arguments: tty pointer to tty isntance data
368 * data pointer to received data
369 * flags pointer to flags for data
370 * count count of received data in bytes
374 static void hci_uart_tty_receive(struct tty_struct
*tty
, const __u8
*data
, char *flags
, int count
)
376 struct hci_uart
*hu
= (void *)tty
->disc_data
;
378 if (!hu
|| tty
!= hu
->tty
)
381 if (!test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
384 spin_lock(&hu
->rx_lock
);
385 hu
->proto
->recv(hu
, (void *) data
, count
);
386 hu
->hdev
->stat
.byte_rx
+= count
;
387 spin_unlock(&hu
->rx_lock
);
389 if (test_and_clear_bit(TTY_THROTTLED
,&tty
->flags
) && tty
->driver
->unthrottle
)
390 tty
->driver
->unthrottle(tty
);
393 static int hci_uart_register_dev(struct hci_uart
*hu
)
395 struct hci_dev
*hdev
;
399 /* Initialize and register HCI device */
400 hdev
= hci_alloc_dev();
402 BT_ERR("Can't allocate HCI device");
408 hdev
->type
= HCI_UART
;
409 hdev
->driver_data
= hu
;
411 hdev
->open
= hci_uart_open
;
412 hdev
->close
= hci_uart_close
;
413 hdev
->flush
= hci_uart_flush
;
414 hdev
->send
= hci_uart_send_frame
;
415 hdev
->destruct
= hci_uart_destruct
;
417 hdev
->owner
= THIS_MODULE
;
420 set_bit(HCI_QUIRK_RESET_ON_INIT
, &hdev
->quirks
);
422 if (hci_register_dev(hdev
) < 0) {
423 BT_ERR("Can't register HCI device");
431 static int hci_uart_set_proto(struct hci_uart
*hu
, int id
)
433 struct hci_uart_proto
*p
;
436 p
= hci_uart_get_proto(id
);
438 return -EPROTONOSUPPORT
;
446 err
= hci_uart_register_dev(hu
);
454 /* hci_uart_tty_ioctl()
456 * Process IOCTL system call for the tty device.
460 * tty pointer to tty instance data
461 * file pointer to open file object for device
462 * cmd IOCTL command code
463 * arg argument for IOCTL call (cmd dependent)
465 * Return Value: Command dependent
467 static int hci_uart_tty_ioctl(struct tty_struct
*tty
, struct file
* file
,
468 unsigned int cmd
, unsigned long arg
)
470 struct hci_uart
*hu
= (void *)tty
->disc_data
;
475 /* Verify the status of the device */
480 case HCIUARTSETPROTO
:
481 if (!test_and_set_bit(HCI_UART_PROTO_SET
, &hu
->flags
)) {
482 err
= hci_uart_set_proto(hu
, arg
);
484 clear_bit(HCI_UART_PROTO_SET
, &hu
->flags
);
487 tty
->low_latency
= 1;
491 case HCIUARTGETPROTO
:
492 if (test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
493 return hu
->proto
->id
;
497 err
= n_tty_ioctl(tty
, file
, cmd
, arg
);
505 * We don't provide read/write/poll interface for user space.
507 static ssize_t
hci_uart_tty_read(struct tty_struct
*tty
, struct file
*file
, unsigned char __user
*buf
, size_t nr
)
511 static ssize_t
hci_uart_tty_write(struct tty_struct
*tty
, struct file
*file
, const unsigned char *data
, size_t count
)
515 static unsigned int hci_uart_tty_poll(struct tty_struct
*tty
, struct file
*filp
, poll_table
*wait
)
520 #ifdef CONFIG_BT_HCIUART_H4
524 #ifdef CONFIG_BT_HCIUART_BCSP
526 int bcsp_deinit(void);
529 static int __init
hci_uart_init(void)
531 static struct tty_ldisc hci_uart_ldisc
;
534 BT_INFO("HCI UART driver ver %s", VERSION
);
536 /* Register the tty discipline */
538 memset(&hci_uart_ldisc
, 0, sizeof (hci_uart_ldisc
));
539 hci_uart_ldisc
.magic
= TTY_LDISC_MAGIC
;
540 hci_uart_ldisc
.name
= "n_hci";
541 hci_uart_ldisc
.open
= hci_uart_tty_open
;
542 hci_uart_ldisc
.close
= hci_uart_tty_close
;
543 hci_uart_ldisc
.read
= hci_uart_tty_read
;
544 hci_uart_ldisc
.write
= hci_uart_tty_write
;
545 hci_uart_ldisc
.ioctl
= hci_uart_tty_ioctl
;
546 hci_uart_ldisc
.poll
= hci_uart_tty_poll
;
547 hci_uart_ldisc
.receive_room
= hci_uart_tty_room
;
548 hci_uart_ldisc
.receive_buf
= hci_uart_tty_receive
;
549 hci_uart_ldisc
.write_wakeup
= hci_uart_tty_wakeup
;
550 hci_uart_ldisc
.owner
= THIS_MODULE
;
552 if ((err
= tty_register_ldisc(N_HCI
, &hci_uart_ldisc
))) {
553 BT_ERR("HCI line discipline registration failed. (%d)", err
);
557 #ifdef CONFIG_BT_HCIUART_H4
560 #ifdef CONFIG_BT_HCIUART_BCSP
567 static void __exit
hci_uart_exit(void)
571 #ifdef CONFIG_BT_HCIUART_H4
574 #ifdef CONFIG_BT_HCIUART_BCSP
578 /* Release tty registration of line discipline */
579 if ((err
= tty_register_ldisc(N_HCI
, NULL
)))
580 BT_ERR("Can't unregister HCI line discipline (%d)", err
);
583 module_init(hci_uart_init
);
584 module_exit(hci_uart_exit
);
586 module_param(reset
, bool, 0644);
587 MODULE_PARM_DESC(reset
, "Send HCI reset command on initialization");
589 MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
590 MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION
);
591 MODULE_VERSION(VERSION
);
592 MODULE_LICENSE("GPL");
593 MODULE_ALIAS_LDISC(N_HCI
);