linux/drivers/bluetooth/hci_uart.h
<<
>>
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#ifndef N_HCI
  27#define N_HCI   15
  28#endif
  29
  30/* Ioctls */
  31#define HCIUARTSETPROTO         _IOW('U', 200, int)
  32#define HCIUARTGETPROTO         _IOR('U', 201, int)
  33#define HCIUARTGETDEVICE        _IOR('U', 202, int)
  34#define HCIUARTSETFLAGS         _IOW('U', 203, int)
  35#define HCIUARTGETFLAGS         _IOR('U', 204, int)
  36
  37/* UART protocols */
  38#define HCI_UART_MAX_PROTO      8
  39
  40#define HCI_UART_H4     0
  41#define HCI_UART_BCSP   1
  42#define HCI_UART_3WIRE  2
  43#define HCI_UART_H4DS   3
  44#define HCI_UART_LL     4
  45#define HCI_UART_ATH3K  5
  46#define HCI_UART_INTEL  6
  47#define HCI_UART_BCM    7
  48
  49#define HCI_UART_RAW_DEVICE     0
  50#define HCI_UART_RESET_ON_INIT  1
  51#define HCI_UART_CREATE_AMP     2
  52#define HCI_UART_INIT_PENDING   3
  53#define HCI_UART_EXT_CONFIG     4
  54#define HCI_UART_VND_DETECT     5
  55
  56struct hci_uart;
  57
  58struct hci_uart_proto {
  59        unsigned int id;
  60        const char *name;
  61        int (*open)(struct hci_uart *hu);
  62        int (*close)(struct hci_uart *hu);
  63        int (*flush)(struct hci_uart *hu);
  64        int (*setup)(struct hci_uart *hu);
  65        int (*recv)(struct hci_uart *hu, const void *data, int len);
  66        int (*enqueue)(struct hci_uart *hu, struct sk_buff *skb);
  67        struct sk_buff *(*dequeue)(struct hci_uart *hu);
  68};
  69
  70struct hci_uart {
  71        struct tty_struct       *tty;
  72        struct hci_dev          *hdev;
  73        unsigned long           flags;
  74        unsigned long           hdev_flags;
  75
  76        struct work_struct      init_ready;
  77        struct work_struct      write_work;
  78
  79        const struct hci_uart_proto *proto;
  80        void                    *priv;
  81
  82        struct sk_buff          *tx_skb;
  83        unsigned long           tx_state;
  84        spinlock_t              rx_lock;
  85};
  86
  87/* HCI_UART proto flag bits */
  88#define HCI_UART_PROTO_SET      0
  89#define HCI_UART_REGISTERED     1
  90
  91/* TX states  */
  92#define HCI_UART_SENDING        1
  93#define HCI_UART_TX_WAKEUP      2
  94
  95int hci_uart_register_proto(const struct hci_uart_proto *p);
  96int hci_uart_unregister_proto(const struct hci_uart_proto *p);
  97int hci_uart_tx_wakeup(struct hci_uart *hu);
  98int hci_uart_init_ready(struct hci_uart *hu);
  99
 100#ifdef CONFIG_BT_HCIUART_H4
 101int h4_init(void);
 102int h4_deinit(void);
 103
 104struct h4_recv_pkt {
 105        u8  type;       /* Packet type */
 106        u8  hlen;       /* Header length */
 107        u8  loff;       /* Data length offset in header */
 108        u8  lsize;      /* Data length field size */
 109        u16 maxlen;     /* Max overall packet length */
 110        int (*recv)(struct hci_dev *hdev, struct sk_buff *skb);
 111};
 112
 113#define H4_RECV_ACL \
 114        .type = HCI_ACLDATA_PKT, \
 115        .hlen = HCI_ACL_HDR_SIZE, \
 116        .loff = 2, \
 117        .lsize = 2, \
 118        .maxlen = HCI_MAX_FRAME_SIZE \
 119
 120#define H4_RECV_SCO \
 121        .type = HCI_SCODATA_PKT, \
 122        .hlen = HCI_SCO_HDR_SIZE, \
 123        .loff = 2, \
 124        .lsize = 1, \
 125        .maxlen = HCI_MAX_SCO_SIZE
 126
 127#define H4_RECV_EVENT \
 128        .type = HCI_EVENT_PKT, \
 129        .hlen = HCI_EVENT_HDR_SIZE, \
 130        .loff = 1, \
 131        .lsize = 1, \
 132        .maxlen = HCI_MAX_EVENT_SIZE
 133
 134struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
 135                            const unsigned char *buffer, int count,
 136                            const struct h4_recv_pkt *pkts, int pkts_count);
 137#endif
 138
 139#ifdef CONFIG_BT_HCIUART_BCSP
 140int bcsp_init(void);
 141int bcsp_deinit(void);
 142#endif
 143
 144#ifdef CONFIG_BT_HCIUART_LL
 145int ll_init(void);
 146int ll_deinit(void);
 147#endif
 148
 149#ifdef CONFIG_BT_HCIUART_ATH3K
 150int ath_init(void);
 151int ath_deinit(void);
 152#endif
 153
 154#ifdef CONFIG_BT_HCIUART_3WIRE
 155int h5_init(void);
 156int h5_deinit(void);
 157#endif
 158
 159#ifdef CONFIG_BT_HCIUART_BCM
 160int bcm_init(void);
 161int bcm_deinit(void);
 162#endif
 163