linux/drivers/bluetooth/hci_h4.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 "1.2"
  50
  51struct h4_struct {
  52        unsigned long rx_state;
  53        unsigned long rx_count;
  54        struct sk_buff *rx_skb;
  55        struct sk_buff_head txq;
  56};
  57
  58/* H4 receiver States */
  59#define H4_W4_PACKET_TYPE       0
  60#define H4_W4_EVENT_HDR         1
  61#define H4_W4_ACL_HDR           2
  62#define H4_W4_SCO_HDR           3
  63#define H4_W4_DATA              4
  64
  65/* Initialize protocol */
  66static int h4_open(struct hci_uart *hu)
  67{
  68        struct h4_struct *h4;
  69
  70        BT_DBG("hu %p", hu);
  71
  72        h4 = kzalloc(sizeof(*h4), GFP_ATOMIC);
  73        if (!h4)
  74                return -ENOMEM;
  75
  76        skb_queue_head_init(&h4->txq);
  77
  78        hu->priv = h4;
  79        return 0;
  80}
  81
  82/* Flush protocol data */
  83static int h4_flush(struct hci_uart *hu)
  84{
  85        struct h4_struct *h4 = hu->priv;
  86
  87        BT_DBG("hu %p", hu);
  88
  89        skb_queue_purge(&h4->txq);
  90
  91        return 0;
  92}
  93
  94/* Close protocol */
  95static int h4_close(struct hci_uart *hu)
  96{
  97        struct h4_struct *h4 = hu->priv;
  98
  99        hu->priv = NULL;
 100
 101        BT_DBG("hu %p", hu);
 102
 103        skb_queue_purge(&h4->txq);
 104
 105        kfree_skb(h4->rx_skb);
 106
 107        hu->priv = NULL;
 108        kfree(h4);
 109
 110        return 0;
 111}
 112
 113/* Enqueue frame for transmittion (padding, crc, etc) */
 114static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb)
 115{
 116        struct h4_struct *h4 = hu->priv;
 117
 118        BT_DBG("hu %p skb %p", hu, skb);
 119
 120        /* Prepend skb with frame type */
 121        memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
 122        skb_queue_tail(&h4->txq, skb);
 123
 124        return 0;
 125}
 126
 127static inline int h4_check_data_len(struct h4_struct *h4, int len)
 128{
 129        register int room = skb_tailroom(h4->rx_skb);
 130
 131        BT_DBG("len %d room %d", len, room);
 132
 133        if (!len) {
 134                hci_recv_frame(h4->rx_skb);
 135        } else if (len > room) {
 136                BT_ERR("Data length is too large");
 137                kfree_skb(h4->rx_skb);
 138        } else {
 139                h4->rx_state = H4_W4_DATA;
 140                h4->rx_count = len;
 141                return len;
 142        }
 143
 144        h4->rx_state = H4_W4_PACKET_TYPE;
 145        h4->rx_skb   = NULL;
 146        h4->rx_count = 0;
 147
 148        return 0;
 149}
 150
 151/* Recv data */
 152static int h4_recv(struct hci_uart *hu, void *data, int count)
 153{
 154        struct h4_struct *h4 = hu->priv;
 155        register char *ptr;
 156        struct hci_event_hdr *eh;
 157        struct hci_acl_hdr   *ah;
 158        struct hci_sco_hdr   *sh;
 159        register int len, type, dlen;
 160
 161        BT_DBG("hu %p count %d rx_state %ld rx_count %ld", 
 162                        hu, count, h4->rx_state, h4->rx_count);
 163
 164        ptr = data;
 165        while (count) {
 166                if (h4->rx_count) {
 167                        len = min_t(unsigned int, h4->rx_count, count);
 168                        memcpy(skb_put(h4->rx_skb, len), ptr, len);
 169                        h4->rx_count -= len; count -= len; ptr += len;
 170
 171                        if (h4->rx_count)
 172                                continue;
 173
 174                        switch (h4->rx_state) {
 175                        case H4_W4_DATA:
 176                                BT_DBG("Complete data");
 177
 178                                hci_recv_frame(h4->rx_skb);
 179
 180                                h4->rx_state = H4_W4_PACKET_TYPE;
 181                                h4->rx_skb = NULL;
 182                                continue;
 183
 184                        case H4_W4_EVENT_HDR:
 185                                eh = hci_event_hdr(h4->rx_skb);
 186
 187                                BT_DBG("Event header: evt 0x%2.2x plen %d", eh->evt, eh->plen);
 188
 189                                h4_check_data_len(h4, eh->plen);
 190                                continue;
 191
 192                        case H4_W4_ACL_HDR:
 193                                ah = hci_acl_hdr(h4->rx_skb);
 194                                dlen = __le16_to_cpu(ah->dlen);
 195
 196                                BT_DBG("ACL header: dlen %d", dlen);
 197
 198                                h4_check_data_len(h4, dlen);
 199                                continue;
 200
 201                        case H4_W4_SCO_HDR:
 202                                sh = hci_sco_hdr(h4->rx_skb);
 203
 204                                BT_DBG("SCO header: dlen %d", sh->dlen);
 205
 206                                h4_check_data_len(h4, sh->dlen);
 207                                continue;
 208                        }
 209                }
 210
 211                /* H4_W4_PACKET_TYPE */
 212                switch (*ptr) {
 213                case HCI_EVENT_PKT:
 214                        BT_DBG("Event packet");
 215                        h4->rx_state = H4_W4_EVENT_HDR;
 216                        h4->rx_count = HCI_EVENT_HDR_SIZE;
 217                        type = HCI_EVENT_PKT;
 218                        break;
 219
 220                case HCI_ACLDATA_PKT:
 221                        BT_DBG("ACL packet");
 222                        h4->rx_state = H4_W4_ACL_HDR;
 223                        h4->rx_count = HCI_ACL_HDR_SIZE;
 224                        type = HCI_ACLDATA_PKT;
 225                        break;
 226
 227                case HCI_SCODATA_PKT:
 228                        BT_DBG("SCO packet");
 229                        h4->rx_state = H4_W4_SCO_HDR;
 230                        h4->rx_count = HCI_SCO_HDR_SIZE;
 231                        type = HCI_SCODATA_PKT;
 232                        break;
 233
 234                default:
 235                        BT_ERR("Unknown HCI packet type %2.2x", (__u8)*ptr);
 236                        hu->hdev->stat.err_rx++;
 237                        ptr++; count--;
 238                        continue;
 239                };
 240
 241                ptr++; count--;
 242
 243                /* Allocate packet */
 244                h4->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
 245                if (!h4->rx_skb) {
 246                        BT_ERR("Can't allocate mem for new packet");
 247                        h4->rx_state = H4_W4_PACKET_TYPE;
 248                        h4->rx_count = 0;
 249                        return 0;
 250                }
 251
 252                h4->rx_skb->dev = (void *) hu->hdev;
 253                bt_cb(h4->rx_skb)->pkt_type = type;
 254        }
 255
 256        return count;
 257}
 258
 259static struct sk_buff *h4_dequeue(struct hci_uart *hu)
 260{
 261        struct h4_struct *h4 = hu->priv;
 262        return skb_dequeue(&h4->txq);
 263}
 264
 265static struct hci_uart_proto h4p = {
 266        .id             = HCI_UART_H4,
 267        .open           = h4_open,
 268        .close          = h4_close,
 269        .recv           = h4_recv,
 270        .enqueue        = h4_enqueue,
 271        .dequeue        = h4_dequeue,
 272        .flush          = h4_flush,
 273};
 274
 275int h4_init(void)
 276{
 277        int err = hci_uart_register_proto(&h4p);
 278
 279        if (!err)
 280                BT_INFO("HCI H4 protocol initialized");
 281        else
 282                BT_ERR("HCI H4 protocol registration failed");
 283
 284        return err;
 285}
 286
 287int h4_deinit(void)
 288{
 289        return hci_uart_unregister_proto(&h4p);
 290}
 291