• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/bluetooth/
1/*
2 *
3 *  Bluetooth HCI UART driver
4 *
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>
8 *
9 *
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.
14 *
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.
19 *
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
23 *
24 */
25
26#include <linux/module.h>
27
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>
35
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>
43
44#include <net/bluetooth/bluetooth.h>
45#include <net/bluetooth/hci_core.h>
46
47#include "hci_uart.h"
48
49#define VERSION "2.2"
50
51static int reset = 0;
52
53static struct hci_uart_proto *hup[HCI_UART_MAX_PROTO];
54
55int hci_uart_register_proto(struct hci_uart_proto *p)
56{
57	if (p->id >= HCI_UART_MAX_PROTO)
58		return -EINVAL;
59
60	if (hup[p->id])
61		return -EEXIST;
62
63	hup[p->id] = p;
64
65	return 0;
66}
67
68int hci_uart_unregister_proto(struct hci_uart_proto *p)
69{
70	if (p->id >= HCI_UART_MAX_PROTO)
71		return -EINVAL;
72
73	if (!hup[p->id])
74		return -EINVAL;
75
76	hup[p->id] = NULL;
77
78	return 0;
79}
80
81static struct hci_uart_proto *hci_uart_get_proto(unsigned int id)
82{
83	if (id >= HCI_UART_MAX_PROTO)
84		return NULL;
85
86	return hup[id];
87}
88
89static inline void hci_uart_tx_complete(struct hci_uart *hu, int pkt_type)
90{
91	struct hci_dev *hdev = hu->hdev;
92
93	/* Update HCI stat counters */
94	switch (pkt_type) {
95	case HCI_COMMAND_PKT:
96		hdev->stat.cmd_tx++;
97		break;
98
99	case HCI_ACLDATA_PKT:
100		hdev->stat.acl_tx++;
101		break;
102
103	case HCI_SCODATA_PKT:
104		hdev->stat.cmd_tx++;
105		break;
106	}
107}
108
109static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)
110{
111	struct sk_buff *skb = hu->tx_skb;
112
113	if (!skb)
114		skb = hu->proto->dequeue(hu);
115	else
116		hu->tx_skb = NULL;
117
118	return skb;
119}
120
121int hci_uart_tx_wakeup(struct hci_uart *hu)
122{
123	struct tty_struct *tty = hu->tty;
124	struct hci_dev *hdev = hu->hdev;
125	struct sk_buff *skb;
126
127	if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) {
128		set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
129		return 0;
130	}
131
132	BT_DBG("");
133
134restart:
135	clear_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
136
137	while ((skb = hci_uart_dequeue(hu))) {
138		int len;
139
140		set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
141		len = tty->ops->write(tty, skb->data, skb->len);
142		hdev->stat.byte_tx += len;
143
144		skb_pull(skb, len);
145		if (skb->len) {
146			hu->tx_skb = skb;
147			break;
148		}
149
150		hci_uart_tx_complete(hu, bt_cb(skb)->pkt_type);
151		kfree_skb(skb);
152	}
153
154	if (test_bit(HCI_UART_TX_WAKEUP, &hu->tx_state))
155		goto restart;
156
157	clear_bit(HCI_UART_SENDING, &hu->tx_state);
158	return 0;
159}
160
161/* ------- Interface to HCI layer ------ */
162/* Initialize device */
163static int hci_uart_open(struct hci_dev *hdev)
164{
165	BT_DBG("%s %p", hdev->name, hdev);
166
167	/* Nothing to do for UART driver */
168
169	set_bit(HCI_RUNNING, &hdev->flags);
170
171	return 0;
172}
173
174/* Reset device */
175static int hci_uart_flush(struct hci_dev *hdev)
176{
177	struct hci_uart *hu  = (struct hci_uart *) hdev->driver_data;
178	struct tty_struct *tty = hu->tty;
179
180	BT_DBG("hdev %p tty %p", hdev, tty);
181
182	if (hu->tx_skb) {
183		kfree_skb(hu->tx_skb); hu->tx_skb = NULL;
184	}
185
186	/* Flush any pending characters in the driver and discipline. */
187	tty_ldisc_flush(tty);
188	tty_driver_flush_buffer(tty);
189
190	if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
191		hu->proto->flush(hu);
192
193	return 0;
194}
195
196/* Close device */
197static int hci_uart_close(struct hci_dev *hdev)
198{
199	BT_DBG("hdev %p", hdev);
200
201	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
202		return 0;
203
204	hci_uart_flush(hdev);
205	hdev->flush = NULL;
206	return 0;
207}
208
209/* Send frames from HCI layer */
210static int hci_uart_send_frame(struct sk_buff *skb)
211{
212	struct hci_dev* hdev = (struct hci_dev *) skb->dev;
213	struct hci_uart *hu;
214
215	if (!hdev) {
216		BT_ERR("Frame for unknown device (hdev=NULL)");
217		return -ENODEV;
218	}
219
220	if (!test_bit(HCI_RUNNING, &hdev->flags))
221		return -EBUSY;
222
223	hu = (struct hci_uart *) hdev->driver_data;
224
225	BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
226
227	hu->proto->enqueue(hu, skb);
228
229	hci_uart_tx_wakeup(hu);
230
231	return 0;
232}
233
234static void hci_uart_destruct(struct hci_dev *hdev)
235{
236	if (!hdev)
237		return;
238
239	BT_DBG("%s", hdev->name);
240	kfree(hdev->driver_data);
241}
242
243/* ------ LDISC part ------ */
244/* hci_uart_tty_open
245 *
246 *     Called when line discipline changed to HCI_UART.
247 *
248 * Arguments:
249 *     tty    pointer to tty info structure
250 * Return Value:
251 *     0 if success, otherwise error code
252 */
253static int hci_uart_tty_open(struct tty_struct *tty)
254{
255	struct hci_uart *hu = (void *) tty->disc_data;
256
257	BT_DBG("tty %p", tty);
258
259	if (hu)
260		return -EEXIST;
261
262	/* Error if the tty has no write op instead of leaving an exploitable
263	   hole */
264	if (tty->ops->write == NULL)
265		return -EOPNOTSUPP;
266
267	if (!(hu = kzalloc(sizeof(struct hci_uart), GFP_KERNEL))) {
268		BT_ERR("Can't allocate control structure");
269		return -ENFILE;
270	}
271
272	tty->disc_data = hu;
273	hu->tty = tty;
274	tty->receive_room = 65536;
275
276	spin_lock_init(&hu->rx_lock);
277
278	/* Flush any pending characters in the driver and line discipline. */
279
280
281	if (tty->ldisc->ops->flush_buffer)
282		tty->ldisc->ops->flush_buffer(tty);
283	tty_driver_flush_buffer(tty);
284
285	return 0;
286}
287
288/* hci_uart_tty_close()
289 *
290 *    Called when the line discipline is changed to something
291 *    else, the tty is closed, or the tty detects a hangup.
292 */
293static void hci_uart_tty_close(struct tty_struct *tty)
294{
295	struct hci_uart *hu = (void *)tty->disc_data;
296
297	BT_DBG("tty %p", tty);
298
299	/* Detach from the tty */
300	tty->disc_data = NULL;
301
302	if (hu) {
303		struct hci_dev *hdev = hu->hdev;
304
305		if (hdev)
306			hci_uart_close(hdev);
307
308		if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
309			hu->proto->close(hu);
310			hci_unregister_dev(hdev);
311			hci_free_dev(hdev);
312		}
313	}
314}
315
316/* hci_uart_tty_wakeup()
317 *
318 *    Callback for transmit wakeup. Called when low level
319 *    device driver can accept more send data.
320 *
321 * Arguments:        tty    pointer to associated tty instance data
322 * Return Value:    None
323 */
324static void hci_uart_tty_wakeup(struct tty_struct *tty)
325{
326	struct hci_uart *hu = (void *)tty->disc_data;
327
328	BT_DBG("");
329
330	if (!hu)
331		return;
332
333	clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
334
335	if (tty != hu->tty)
336		return;
337
338	if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
339		hci_uart_tx_wakeup(hu);
340}
341
342/* hci_uart_tty_receive()
343 *
344 *     Called by tty low level driver when receive data is
345 *     available.
346 *
347 * Arguments:  tty          pointer to tty isntance data
348 *             data         pointer to received data
349 *             flags        pointer to flags for data
350 *             count        count of received data in bytes
351 *
352 * Return Value:    None
353 */
354static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
355{
356	struct hci_uart *hu = (void *)tty->disc_data;
357
358	if (!hu || tty != hu->tty)
359		return;
360
361	if (!test_bit(HCI_UART_PROTO_SET, &hu->flags))
362		return;
363
364	spin_lock(&hu->rx_lock);
365	hu->proto->recv(hu, (void *) data, count);
366	hu->hdev->stat.byte_rx += count;
367	spin_unlock(&hu->rx_lock);
368
369	tty_unthrottle(tty);
370}
371
372static int hci_uart_register_dev(struct hci_uart *hu)
373{
374	struct hci_dev *hdev;
375
376	BT_DBG("");
377
378	/* Initialize and register HCI device */
379	hdev = hci_alloc_dev();
380	if (!hdev) {
381		BT_ERR("Can't allocate HCI device");
382		return -ENOMEM;
383	}
384
385	hu->hdev = hdev;
386
387	hdev->bus = HCI_UART;
388	hdev->driver_data = hu;
389
390	hdev->open  = hci_uart_open;
391	hdev->close = hci_uart_close;
392	hdev->flush = hci_uart_flush;
393	hdev->send  = hci_uart_send_frame;
394	hdev->destruct = hci_uart_destruct;
395
396	hdev->owner = THIS_MODULE;
397
398	if (!reset)
399		set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
400
401	if (test_bit(HCI_UART_RAW_DEVICE, &hu->hdev_flags))
402		set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
403
404	if (hci_register_dev(hdev) < 0) {
405		BT_ERR("Can't register HCI device");
406		hci_free_dev(hdev);
407		return -ENODEV;
408	}
409
410	return 0;
411}
412
413static int hci_uart_set_proto(struct hci_uart *hu, int id)
414{
415	struct hci_uart_proto *p;
416	int err;
417
418	p = hci_uart_get_proto(id);
419	if (!p)
420		return -EPROTONOSUPPORT;
421
422	err = p->open(hu);
423	if (err)
424		return err;
425
426	hu->proto = p;
427
428	err = hci_uart_register_dev(hu);
429	if (err) {
430		p->close(hu);
431		return err;
432	}
433
434	return 0;
435}
436
437/* hci_uart_tty_ioctl()
438 *
439 *    Process IOCTL system call for the tty device.
440 *
441 * Arguments:
442 *
443 *    tty        pointer to tty instance data
444 *    file       pointer to open file object for device
445 *    cmd        IOCTL command code
446 *    arg        argument for IOCTL call (cmd dependent)
447 *
448 * Return Value:    Command dependent
449 */
450static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file * file,
451					unsigned int cmd, unsigned long arg)
452{
453	struct hci_uart *hu = (void *)tty->disc_data;
454	int err = 0;
455
456	BT_DBG("");
457
458	/* Verify the status of the device */
459	if (!hu)
460		return -EBADF;
461
462	switch (cmd) {
463	case HCIUARTSETPROTO:
464		if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
465			err = hci_uart_set_proto(hu, arg);
466			if (err) {
467				clear_bit(HCI_UART_PROTO_SET, &hu->flags);
468				return err;
469			}
470		} else
471			return -EBUSY;
472		break;
473
474	case HCIUARTGETPROTO:
475		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
476			return hu->proto->id;
477		return -EUNATCH;
478
479	case HCIUARTGETDEVICE:
480		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
481			return hu->hdev->id;
482		return -EUNATCH;
483
484	case HCIUARTSETFLAGS:
485		if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
486			return -EBUSY;
487		hu->hdev_flags = arg;
488		break;
489
490	case HCIUARTGETFLAGS:
491		return hu->hdev_flags;
492
493	default:
494		err = n_tty_ioctl_helper(tty, file, cmd, arg);
495		break;
496	};
497
498	return err;
499}
500
501/*
502 * We don't provide read/write/poll interface for user space.
503 */
504static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
505					unsigned char __user *buf, size_t nr)
506{
507	return 0;
508}
509
510static ssize_t hci_uart_tty_write(struct tty_struct *tty, struct file *file,
511					const unsigned char *data, size_t count)
512{
513	return 0;
514}
515
516static unsigned int hci_uart_tty_poll(struct tty_struct *tty,
517					struct file *filp, poll_table *wait)
518{
519	return 0;
520}
521
522static int __init hci_uart_init(void)
523{
524	static struct tty_ldisc_ops hci_uart_ldisc;
525	int err;
526
527	BT_INFO("HCI UART driver ver %s", VERSION);
528
529	/* Register the tty discipline */
530
531	memset(&hci_uart_ldisc, 0, sizeof (hci_uart_ldisc));
532	hci_uart_ldisc.magic		= TTY_LDISC_MAGIC;
533	hci_uart_ldisc.name		= "n_hci";
534	hci_uart_ldisc.open		= hci_uart_tty_open;
535	hci_uart_ldisc.close		= hci_uart_tty_close;
536	hci_uart_ldisc.read		= hci_uart_tty_read;
537	hci_uart_ldisc.write		= hci_uart_tty_write;
538	hci_uart_ldisc.ioctl		= hci_uart_tty_ioctl;
539	hci_uart_ldisc.poll		= hci_uart_tty_poll;
540	hci_uart_ldisc.receive_buf	= hci_uart_tty_receive;
541	hci_uart_ldisc.write_wakeup	= hci_uart_tty_wakeup;
542	hci_uart_ldisc.owner		= THIS_MODULE;
543
544	if ((err = tty_register_ldisc(N_HCI, &hci_uart_ldisc))) {
545		BT_ERR("HCI line discipline registration failed. (%d)", err);
546		return err;
547	}
548
549#ifdef CONFIG_BT_HCIUART_H4
550	h4_init();
551#endif
552#ifdef CONFIG_BT_HCIUART_BCSP
553	bcsp_init();
554#endif
555#ifdef CONFIG_BT_HCIUART_LL
556	ll_init();
557#endif
558#ifdef CONFIG_BT_HCIUART_ATH3K
559	ath_init();
560#endif
561
562	return 0;
563}
564
565static void __exit hci_uart_exit(void)
566{
567	int err;
568
569#ifdef CONFIG_BT_HCIUART_H4
570	h4_deinit();
571#endif
572#ifdef CONFIG_BT_HCIUART_BCSP
573	bcsp_deinit();
574#endif
575#ifdef CONFIG_BT_HCIUART_LL
576	ll_deinit();
577#endif
578#ifdef CONFIG_BT_HCIUART_ATH3K
579	ath_deinit();
580#endif
581
582	/* Release tty registration of line discipline */
583	if ((err = tty_unregister_ldisc(N_HCI)))
584		BT_ERR("Can't unregister HCI line discipline (%d)", err);
585}
586
587module_init(hci_uart_init);
588module_exit(hci_uart_exit);
589
590module_param(reset, bool, 0644);
591MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
592
593MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
594MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION);
595MODULE_VERSION(VERSION);
596MODULE_LICENSE("GPL");
597MODULE_ALIAS_LDISC(N_HCI);
598