linux/drivers/bluetooth/hci_ldisc.c
<<
>>
Prefs
   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 tty_struct *tty;
 214        struct hci_uart *hu;
 215
 216        if (!hdev) {
 217                BT_ERR("Frame for uknown device (hdev=NULL)");
 218                return -ENODEV;
 219        }
 220
 221        if (!test_bit(HCI_RUNNING, &hdev->flags))
 222                return -EBUSY;
 223
 224        hu = (struct hci_uart *) hdev->driver_data;
 225        tty = hu->tty;
 226
 227        BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
 228
 229        hu->proto->enqueue(hu, skb);
 230
 231        hci_uart_tx_wakeup(hu);
 232
 233        return 0;
 234}
 235
 236static void hci_uart_destruct(struct hci_dev *hdev)
 237{
 238        if (!hdev)
 239                return;
 240
 241        BT_DBG("%s", hdev->name);
 242        kfree(hdev->driver_data);
 243}
 244
 245/* ------ LDISC part ------ */
 246/* hci_uart_tty_open
 247 * 
 248 *     Called when line discipline changed to HCI_UART.
 249 *
 250 * Arguments:
 251 *     tty    pointer to tty info structure
 252 * Return Value:    
 253 *     0 if success, otherwise error code
 254 */
 255static int hci_uart_tty_open(struct tty_struct *tty)
 256{
 257        struct hci_uart *hu = (void *) tty->disc_data;
 258
 259        BT_DBG("tty %p", tty);
 260
 261        if (hu)
 262                return -EEXIST;
 263
 264        if (!(hu = kzalloc(sizeof(struct hci_uart), GFP_KERNEL))) {
 265                BT_ERR("Can't allocate control structure");
 266                return -ENFILE;
 267        }
 268
 269        tty->disc_data = hu;
 270        hu->tty = tty;
 271        tty->receive_room = 65536;
 272
 273        spin_lock_init(&hu->rx_lock);
 274
 275        /* Flush any pending characters in the driver and line discipline. */
 276
 277        /* FIXME: why is this needed. Note don't use ldisc_ref here as the
 278           open path is before the ldisc is referencable */
 279
 280        if (tty->ldisc->ops->flush_buffer)
 281                tty->ldisc->ops->flush_buffer(tty);
 282        tty_driver_flush_buffer(tty);
 283
 284        return 0;
 285}
 286
 287/* hci_uart_tty_close()
 288 *
 289 *    Called when the line discipline is changed to something
 290 *    else, the tty is closed, or the tty detects a hangup.
 291 */
 292static void hci_uart_tty_close(struct tty_struct *tty)
 293{
 294        struct hci_uart *hu = (void *)tty->disc_data;
 295
 296        BT_DBG("tty %p", tty);
 297
 298        /* Detach from the tty */
 299        tty->disc_data = NULL;
 300
 301        if (hu) {
 302                struct hci_dev *hdev = hu->hdev;
 303
 304                if (hdev)
 305                        hci_uart_close(hdev);
 306
 307                if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
 308                        hu->proto->close(hu);
 309                        hci_unregister_dev(hdev);
 310                        hci_free_dev(hdev);
 311                }
 312        }
 313}
 314
 315/* hci_uart_tty_wakeup()
 316 *
 317 *    Callback for transmit wakeup. Called when low level
 318 *    device driver can accept more send data.
 319 *
 320 * Arguments:        tty    pointer to associated tty instance data
 321 * Return Value:    None
 322 */
 323static void hci_uart_tty_wakeup(struct tty_struct *tty)
 324{
 325        struct hci_uart *hu = (void *)tty->disc_data;
 326
 327        BT_DBG("");
 328
 329        if (!hu)
 330                return;
 331
 332        clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
 333
 334        if (tty != hu->tty)
 335                return;
 336
 337        if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
 338                hci_uart_tx_wakeup(hu);
 339}
 340
 341/* hci_uart_tty_receive()
 342 * 
 343 *     Called by tty low level driver when receive data is
 344 *     available.
 345 *     
 346 * Arguments:  tty          pointer to tty isntance data
 347 *             data         pointer to received data
 348 *             flags        pointer to flags for data
 349 *             count        count of received data in bytes
 350 *     
 351 * Return Value:    None
 352 */
 353static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
 354{
 355        struct hci_uart *hu = (void *)tty->disc_data;
 356
 357        if (!hu || tty != hu->tty)
 358                return;
 359
 360        if (!test_bit(HCI_UART_PROTO_SET, &hu->flags))
 361                return;
 362
 363        spin_lock(&hu->rx_lock);
 364        hu->proto->recv(hu, (void *) data, count);
 365        hu->hdev->stat.byte_rx += count;
 366        spin_unlock(&hu->rx_lock);
 367
 368        tty_unthrottle(tty);
 369}
 370
 371static int hci_uart_register_dev(struct hci_uart *hu)
 372{
 373        struct hci_dev *hdev;
 374
 375        BT_DBG("");
 376
 377        /* Initialize and register HCI device */
 378        hdev = hci_alloc_dev();
 379        if (!hdev) {
 380                BT_ERR("Can't allocate HCI device");
 381                return -ENOMEM;
 382        }
 383
 384        hu->hdev = hdev;
 385
 386        hdev->type = HCI_UART;
 387        hdev->driver_data = hu;
 388
 389        hdev->open  = hci_uart_open;
 390        hdev->close = hci_uart_close;
 391        hdev->flush = hci_uart_flush;
 392        hdev->send  = hci_uart_send_frame;
 393        hdev->destruct = hci_uart_destruct;
 394
 395        hdev->owner = THIS_MODULE;
 396
 397        if (!reset)
 398                set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
 399
 400        if (hci_register_dev(hdev) < 0) {
 401                BT_ERR("Can't register HCI device");
 402                hci_free_dev(hdev);
 403                return -ENODEV;
 404        }
 405
 406        return 0;
 407}
 408
 409static int hci_uart_set_proto(struct hci_uart *hu, int id)
 410{
 411        struct hci_uart_proto *p;
 412        int err;
 413
 414        p = hci_uart_get_proto(id);
 415        if (!p)
 416                return -EPROTONOSUPPORT;
 417
 418        err = p->open(hu);
 419        if (err)
 420                return err;
 421
 422        hu->proto = p;
 423
 424        err = hci_uart_register_dev(hu);
 425        if (err) {
 426                p->close(hu);
 427                return err;
 428        }
 429
 430        return 0;
 431}
 432
 433/* hci_uart_tty_ioctl()
 434 *
 435 *    Process IOCTL system call for the tty device.
 436 *
 437 * Arguments:
 438 *
 439 *    tty        pointer to tty instance data
 440 *    file       pointer to open file object for device
 441 *    cmd        IOCTL command code
 442 *    arg        argument for IOCTL call (cmd dependent)
 443 *
 444 * Return Value:    Command dependent
 445 */
 446static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file * file,
 447                                        unsigned int cmd, unsigned long arg)
 448{
 449        struct hci_uart *hu = (void *)tty->disc_data;
 450        int err = 0;
 451
 452        BT_DBG("");
 453
 454        /* Verify the status of the device */
 455        if (!hu)
 456                return -EBADF;
 457
 458        switch (cmd) {
 459        case HCIUARTSETPROTO:
 460                if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
 461                        err = hci_uart_set_proto(hu, arg);
 462                        if (err) {
 463                                clear_bit(HCI_UART_PROTO_SET, &hu->flags);
 464                                return err;
 465                        }
 466                } else
 467                        return -EBUSY;
 468                break;
 469
 470        case HCIUARTGETPROTO:
 471                if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
 472                        return hu->proto->id;
 473                return -EUNATCH;
 474
 475        case HCIUARTGETDEVICE:
 476                if (test_bit(HCI_UART_PROTO_SET, &hu->flags))
 477                        return hu->hdev->id;
 478                return -EUNATCH;
 479
 480        default:
 481                err = n_tty_ioctl_helper(tty, file, cmd, arg);
 482                break;
 483        };
 484
 485        return err;
 486}
 487
 488/*
 489 * We don't provide read/write/poll interface for user space.
 490 */
 491static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
 492                                        unsigned char __user *buf, size_t nr)
 493{
 494        return 0;
 495}
 496
 497static ssize_t hci_uart_tty_write(struct tty_struct *tty, struct file *file,
 498                                        const unsigned char *data, size_t count)
 499{
 500        return 0;
 501}
 502
 503static unsigned int hci_uart_tty_poll(struct tty_struct *tty,
 504                                        struct file *filp, poll_table *wait)
 505{
 506        return 0;
 507}
 508
 509static int __init hci_uart_init(void)
 510{
 511        static struct tty_ldisc_ops hci_uart_ldisc;
 512        int err;
 513
 514        BT_INFO("HCI UART driver ver %s", VERSION);
 515
 516        /* Register the tty discipline */
 517
 518        memset(&hci_uart_ldisc, 0, sizeof (hci_uart_ldisc));
 519        hci_uart_ldisc.magic            = TTY_LDISC_MAGIC;
 520        hci_uart_ldisc.name             = "n_hci";
 521        hci_uart_ldisc.open             = hci_uart_tty_open;
 522        hci_uart_ldisc.close            = hci_uart_tty_close;
 523        hci_uart_ldisc.read             = hci_uart_tty_read;
 524        hci_uart_ldisc.write            = hci_uart_tty_write;
 525        hci_uart_ldisc.ioctl            = hci_uart_tty_ioctl;
 526        hci_uart_ldisc.poll             = hci_uart_tty_poll;
 527        hci_uart_ldisc.receive_buf      = hci_uart_tty_receive;
 528        hci_uart_ldisc.write_wakeup     = hci_uart_tty_wakeup;
 529        hci_uart_ldisc.owner            = THIS_MODULE;
 530
 531        if ((err = tty_register_ldisc(N_HCI, &hci_uart_ldisc))) {
 532                BT_ERR("HCI line discipline registration failed. (%d)", err);
 533                return err;
 534        }
 535
 536#ifdef CONFIG_BT_HCIUART_H4
 537        h4_init();
 538#endif
 539#ifdef CONFIG_BT_HCIUART_BCSP
 540        bcsp_init();
 541#endif
 542#ifdef CONFIG_BT_HCIUART_LL
 543        ll_init();
 544#endif
 545
 546        return 0;
 547}
 548
 549static void __exit hci_uart_exit(void)
 550{
 551        int err;
 552
 553#ifdef CONFIG_BT_HCIUART_H4
 554        h4_deinit();
 555#endif
 556#ifdef CONFIG_BT_HCIUART_BCSP
 557        bcsp_deinit();
 558#endif
 559#ifdef CONFIG_BT_HCIUART_LL
 560        ll_deinit();
 561#endif
 562
 563        /* Release tty registration of line discipline */
 564        if ((err = tty_unregister_ldisc(N_HCI)))
 565                BT_ERR("Can't unregister HCI line discipline (%d)", err);
 566}
 567
 568module_init(hci_uart_init);
 569module_exit(hci_uart_exit);
 570
 571module_param(reset, bool, 0644);
 572MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
 573
 574MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 575MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION);
 576MODULE_VERSION(VERSION);
 577MODULE_LICENSE("GPL");
 578MODULE_ALIAS_LDISC(N_HCI);
 579