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>
56 #ifndef CONFIG_BT_HCIUART_DEBUG
58 #define BT_DBG( A... )
60 #define BT_DMP( A... )
63 static struct hci_uart_proto
*hup
[HCI_UART_MAX_PROTO
];
65 int hci_uart_register_proto(struct hci_uart_proto
*p
)
67 if (p
->id
>= HCI_UART_MAX_PROTO
)
77 int hci_uart_unregister_proto(struct hci_uart_proto
*p
)
79 if (p
->id
>= HCI_UART_MAX_PROTO
)
89 static struct hci_uart_proto
*hci_uart_get_proto(unsigned int id
)
91 if (id
>= HCI_UART_MAX_PROTO
)
96 static inline void hci_uart_tx_complete(struct hci_uart
*hu
, int pkt_type
)
98 struct hci_dev
*hdev
= hu
->hdev
;
100 /* Update HCI stat counters */
102 case HCI_COMMAND_PKT
:
106 case HCI_ACLDATA_PKT
:
110 case HCI_SCODATA_PKT
:
116 static inline struct sk_buff
*hci_uart_dequeue(struct hci_uart
*hu
)
118 struct sk_buff
*skb
= hu
->tx_skb
;
120 skb
= hu
->proto
->dequeue(hu
);
126 int hci_uart_tx_wakeup(struct hci_uart
*hu
)
128 struct tty_struct
*tty
= hu
->tty
;
129 struct hci_dev
*hdev
= hu
->hdev
;
132 if (test_and_set_bit(HCI_UART_SENDING
, &hu
->tx_state
)) {
133 set_bit(HCI_UART_TX_WAKEUP
, &hu
->tx_state
);
140 clear_bit(HCI_UART_TX_WAKEUP
, &hu
->tx_state
);
142 while ((skb
= hci_uart_dequeue(hu
))) {
145 set_bit(TTY_DO_WRITE_WAKEUP
, &tty
->flags
);
146 len
= tty
->driver
->write(tty
, 0, skb
->data
, skb
->len
);
147 hdev
->stat
.byte_tx
+= len
;
155 hci_uart_tx_complete(hu
, skb
->pkt_type
);
159 if (test_bit(HCI_UART_TX_WAKEUP
, &hu
->tx_state
))
162 clear_bit(HCI_UART_SENDING
, &hu
->tx_state
);
166 /* ------- Interface to HCI layer ------ */
167 /* Initialize device */
168 static int hci_uart_open(struct hci_dev
*hdev
)
170 BT_DBG("%s %p", hdev
->name
, hdev
);
172 /* Nothing to do for UART driver */
174 set_bit(HCI_RUNNING
, &hdev
->flags
);
179 static int hci_uart_flush(struct hci_dev
*hdev
)
181 struct hci_uart
*hu
= (struct hci_uart
*) hdev
->driver_data
;
182 struct tty_struct
*tty
= hu
->tty
;
184 BT_DBG("hdev %p tty %p", hdev
, tty
);
187 kfree_skb(hu
->tx_skb
); hu
->tx_skb
= NULL
;
190 /* Flush any pending characters in the driver and discipline. */
191 tty_ldisc_flush(tty
);
192 if (tty
->driver
->flush_buffer
)
193 tty
->driver
->flush_buffer(tty
);
195 if (test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
196 hu
->proto
->flush(hu
);
202 static int hci_uart_close(struct hci_dev
*hdev
)
204 BT_DBG("hdev %p", hdev
);
206 if (!test_and_clear_bit(HCI_RUNNING
, &hdev
->flags
))
209 hci_uart_flush(hdev
);
213 /* Send frames from HCI layer */
214 static int hci_uart_send_frame(struct sk_buff
*skb
)
216 struct hci_dev
* hdev
= (struct hci_dev
*) skb
->dev
;
217 struct tty_struct
*tty
;
221 BT_ERR("Frame for uknown device (hdev=NULL)");
225 if (!test_bit(HCI_RUNNING
, &hdev
->flags
))
228 hu
= (struct hci_uart
*) hdev
->driver_data
;
231 BT_DBG("%s: type %d len %d", hdev
->name
, skb
->pkt_type
, skb
->len
);
233 hu
->proto
->enqueue(hu
, skb
);
235 hci_uart_tx_wakeup(hu
);
239 static void hci_uart_destruct(struct hci_dev
*hdev
)
245 BT_DBG("%s", hdev
->name
);
247 hu
= (struct hci_uart
*) hdev
->driver_data
;
251 /* ------ LDISC part ------ */
254 * Called when line discipline changed to HCI_UART.
257 * tty pointer to tty info structure
259 * 0 if success, otherwise error code
261 static int hci_uart_tty_open(struct tty_struct
*tty
)
263 struct hci_uart
*hu
= (void *) tty
->disc_data
;
265 BT_DBG("tty %p", tty
);
270 if (!(hu
= kmalloc(sizeof(struct hci_uart
), GFP_KERNEL
))) {
271 BT_ERR("Can't allocate controll structure");
274 memset(hu
, 0, sizeof(struct hci_uart
));
279 spin_lock_init(&hu
->rx_lock
);
281 /* Flush any pending characters in the driver and line discipline. */
282 /* FIXME: why is this needed. Note don't use ldisc_ref here as the
283 open path is before the ldisc is referencable */
284 if (tty
->ldisc
.flush_buffer
)
285 tty
->ldisc
.flush_buffer(tty
);
287 if (tty
->driver
->flush_buffer
)
288 tty
->driver
->flush_buffer(tty
);
293 /* hci_uart_tty_close()
295 * Called when the line discipline is changed to something
296 * else, the tty is closed, or the tty detects a hangup.
298 static void hci_uart_tty_close(struct tty_struct
*tty
)
300 struct hci_uart
*hu
= (void *)tty
->disc_data
;
302 BT_DBG("tty %p", tty
);
304 /* Detach from the tty */
305 tty
->disc_data
= NULL
;
308 struct hci_dev
*hdev
= hu
->hdev
;
309 hci_uart_close(hdev
);
311 if (test_and_clear_bit(HCI_UART_PROTO_SET
, &hu
->flags
)) {
312 hu
->proto
->close(hu
);
313 hci_unregister_dev(hdev
);
319 /* hci_uart_tty_wakeup()
321 * Callback for transmit wakeup. Called when low level
322 * device driver can accept more send data.
324 * Arguments: tty pointer to associated tty instance data
327 static void hci_uart_tty_wakeup(struct tty_struct
*tty
)
329 struct hci_uart
*hu
= (void *)tty
->disc_data
;
336 clear_bit(TTY_DO_WRITE_WAKEUP
, &tty
->flags
);
341 if (test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
342 hci_uart_tx_wakeup(hu
);
345 /* hci_uart_tty_room()
347 * Callback function from tty driver. Return the amount of
348 * space left in the receiver's buffer to decide if remote
349 * transmitter is to be throttled.
351 * Arguments: tty pointer to associated tty instance data
352 * Return Value: number of bytes left in receive buffer
354 static int hci_uart_tty_room (struct tty_struct
*tty
)
359 /* hci_uart_tty_receive()
361 * Called by tty low level driver when receive data is
364 * Arguments: tty pointer to tty isntance data
365 * data pointer to received data
366 * flags pointer to flags for data
367 * count count of received data in bytes
371 static void hci_uart_tty_receive(struct tty_struct
*tty
, const __u8
*data
, char *flags
, int count
)
373 struct hci_uart
*hu
= (void *)tty
->disc_data
;
375 if (!hu
|| tty
!= hu
->tty
)
378 if (!test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
381 spin_lock(&hu
->rx_lock
);
382 hu
->proto
->recv(hu
, (void *) data
, count
);
383 hu
->hdev
->stat
.byte_rx
+= count
;
384 spin_unlock(&hu
->rx_lock
);
386 if (test_and_clear_bit(TTY_THROTTLED
,&tty
->flags
) && tty
->driver
->unthrottle
)
387 tty
->driver
->unthrottle(tty
);
390 static int hci_uart_register_dev(struct hci_uart
*hu
)
392 struct hci_dev
*hdev
;
396 /* Initialize and register HCI device */
397 hdev
= hci_alloc_dev();
399 BT_ERR("Can't allocate HCI device");
405 hdev
->type
= HCI_UART
;
406 hdev
->driver_data
= hu
;
408 hdev
->open
= hci_uart_open
;
409 hdev
->close
= hci_uart_close
;
410 hdev
->flush
= hci_uart_flush
;
411 hdev
->send
= hci_uart_send_frame
;
412 hdev
->destruct
= hci_uart_destruct
;
414 hdev
->owner
= THIS_MODULE
;
416 if (hci_register_dev(hdev
) < 0) {
417 BT_ERR("Can't register HCI device");
425 static int hci_uart_set_proto(struct hci_uart
*hu
, int id
)
427 struct hci_uart_proto
*p
;
430 p
= hci_uart_get_proto(id
);
432 return -EPROTONOSUPPORT
;
440 err
= hci_uart_register_dev(hu
);
448 /* hci_uart_tty_ioctl()
450 * Process IOCTL system call for the tty device.
454 * tty pointer to tty instance data
455 * file pointer to open file object for device
456 * cmd IOCTL command code
457 * arg argument for IOCTL call (cmd dependent)
459 * Return Value: Command dependent
461 static int hci_uart_tty_ioctl(struct tty_struct
*tty
, struct file
* file
,
462 unsigned int cmd
, unsigned long arg
)
464 struct hci_uart
*hu
= (void *)tty
->disc_data
;
469 /* Verify the status of the device */
474 case HCIUARTSETPROTO
:
475 if (!test_and_set_bit(HCI_UART_PROTO_SET
, &hu
->flags
)) {
476 err
= hci_uart_set_proto(hu
, arg
);
478 clear_bit(HCI_UART_PROTO_SET
, &hu
->flags
);
481 tty
->low_latency
= 1;
485 case HCIUARTGETPROTO
:
486 if (test_bit(HCI_UART_PROTO_SET
, &hu
->flags
))
487 return hu
->proto
->id
;
491 err
= n_tty_ioctl(tty
, file
, cmd
, arg
);
499 * We don't provide read/write/poll interface for user space.
501 static ssize_t
hci_uart_tty_read(struct tty_struct
*tty
, struct file
*file
, unsigned char __user
*buf
, size_t nr
)
505 static ssize_t
hci_uart_tty_write(struct tty_struct
*tty
, struct file
*file
, const unsigned char __user
*data
, size_t count
)
509 static unsigned int hci_uart_tty_poll(struct tty_struct
*tty
, struct file
*filp
, poll_table
*wait
)
514 #ifdef CONFIG_BT_HCIUART_H4
518 #ifdef CONFIG_BT_HCIUART_BCSP
520 int bcsp_deinit(void);
523 static int __init
hci_uart_init(void)
525 static struct tty_ldisc hci_uart_ldisc
;
528 BT_INFO("HCI UART driver ver %s", VERSION
);
530 /* Register the tty discipline */
532 memset(&hci_uart_ldisc
, 0, sizeof (hci_uart_ldisc
));
533 hci_uart_ldisc
.magic
= TTY_LDISC_MAGIC
;
534 hci_uart_ldisc
.name
= "n_hci";
535 hci_uart_ldisc
.open
= hci_uart_tty_open
;
536 hci_uart_ldisc
.close
= hci_uart_tty_close
;
537 hci_uart_ldisc
.read
= hci_uart_tty_read
;
538 hci_uart_ldisc
.write
= hci_uart_tty_write
;
539 hci_uart_ldisc
.ioctl
= hci_uart_tty_ioctl
;
540 hci_uart_ldisc
.poll
= hci_uart_tty_poll
;
541 hci_uart_ldisc
.receive_room
= hci_uart_tty_room
;
542 hci_uart_ldisc
.receive_buf
= hci_uart_tty_receive
;
543 hci_uart_ldisc
.write_wakeup
= hci_uart_tty_wakeup
;
544 hci_uart_ldisc
.owner
= THIS_MODULE
;
546 if ((err
= tty_register_ldisc(N_HCI
, &hci_uart_ldisc
))) {
547 BT_ERR("HCI line discipline registration failed. (%d)", err
);
551 #ifdef CONFIG_BT_HCIUART_H4
554 #ifdef CONFIG_BT_HCIUART_BCSP
561 static void __exit
hci_uart_exit(void)
565 #ifdef CONFIG_BT_HCIUART_H4
568 #ifdef CONFIG_BT_HCIUART_BCSP
572 /* Release tty registration of line discipline */
573 if ((err
= tty_register_ldisc(N_HCI
, NULL
)))
574 BT_ERR("Can't unregister HCI line discipline (%d)", err
);
577 module_init(hci_uart_init
);
578 module_exit(hci_uart_exit
);
580 MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>");
581 MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION
);
582 MODULE_VERSION(VERSION
);
583 MODULE_LICENSE("GPL");
584 MODULE_ALIAS_LDISC(N_HCI
);