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      9
  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#define HCI_UART_QCA    8
  49
  50#define HCI_UART_RAW_DEVICE     0
  51#define HCI_UART_RESET_ON_INIT  1
  52#define HCI_UART_CREATE_AMP     2
  53#define HCI_UART_INIT_PENDING   3
  54#define HCI_UART_EXT_CONFIG     4
  55#define HCI_UART_VND_DETECT     5
  56
  57struct hci_uart;
  58
  59struct hci_uart_proto {
  60        unsigned int id;
  61        const char *name;
  62        unsigned int init_speed;
  63        unsigned int oper_speed;
  64        int (*open)(struct hci_uart *hu);
  65        int (*close)(struct hci_uart *hu);
  66        int (*flush)(struct hci_uart *hu);
  67        int (*setup)(struct hci_uart *hu);
  68        int (*set_baudrate)(struct hci_uart *hu, unsigned int speed);
  69        int (*recv)(struct hci_uart *hu, const void *data, int len);
  70        int (*enqueue)(struct hci_uart *hu, struct sk_buff *skb);
  71        struct sk_buff *(*dequeue)(struct hci_uart *hu);
  72};
  73
  74struct hci_uart {
  75        struct tty_struct       *tty;
  76        struct hci_dev          *hdev;
  77        unsigned long           flags;
  78        unsigned long           hdev_flags;
  79
  80        struct work_struct      init_ready;
  81        struct work_struct      write_work;
  82
  83        const struct hci_uart_proto *proto;
  84        void                    *priv;
  85
  86        struct sk_buff          *tx_skb;
  87        unsigned long           tx_state;
  88        spinlock_t              rx_lock;
  89
  90        unsigned int init_speed;
  91        unsigned int oper_speed;
  92};
  93
  94/* HCI_UART proto flag bits */
  95#define HCI_UART_PROTO_SET      0
  96#define HCI_UART_REGISTERED     1
  97
  98/* TX states  */
  99#define HCI_UART_SENDING        1
 100#define HCI_UART_TX_WAKEUP      2
 101
 102int hci_uart_register_proto(const struct hci_uart_proto *p);
 103int hci_uart_unregister_proto(const struct hci_uart_proto *p);
 104int hci_uart_tx_wakeup(struct hci_uart *hu);
 105int hci_uart_init_ready(struct hci_uart *hu);
 106void hci_uart_init_tty(struct hci_uart *hu);
 107void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed);
 108void hci_uart_set_flow_control(struct hci_uart *hu, bool enable);
 109void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed,
 110                         unsigned int oper_speed);
 111
 112#ifdef CONFIG_BT_HCIUART_H4
 113int h4_init(void);
 114int h4_deinit(void);
 115
 116struct h4_recv_pkt {
 117        u8  type;       /* Packet type */
 118        u8  hlen;       /* Header length */
 119        u8  loff;       /* Data length offset in header */
 120        u8  lsize;      /* Data length field size */
 121        u16 maxlen;     /* Max overall packet length */
 122        int (*recv)(struct hci_dev *hdev, struct sk_buff *skb);
 123};
 124
 125#define H4_RECV_ACL \
 126        .type = HCI_ACLDATA_PKT, \
 127        .hlen = HCI_ACL_HDR_SIZE, \
 128        .loff = 2, \
 129        .lsize = 2, \
 130        .maxlen = HCI_MAX_FRAME_SIZE \
 131
 132#define H4_RECV_SCO \
 133        .type = HCI_SCODATA_PKT, \
 134        .hlen = HCI_SCO_HDR_SIZE, \
 135        .loff = 2, \
 136        .lsize = 1, \
 137        .maxlen = HCI_MAX_SCO_SIZE
 138
 139#define H4_RECV_EVENT \
 140        .type = HCI_EVENT_PKT, \
 141        .hlen = HCI_EVENT_HDR_SIZE, \
 142        .loff = 1, \
 143        .lsize = 1, \
 144        .maxlen = HCI_MAX_EVENT_SIZE
 145
 146struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
 147                            const unsigned char *buffer, int count,
 148                            const struct h4_recv_pkt *pkts, int pkts_count);
 149#endif
 150
 151#ifdef CONFIG_BT_HCIUART_BCSP
 152int bcsp_init(void);
 153int bcsp_deinit(void);
 154#endif
 155
 156#ifdef CONFIG_BT_HCIUART_LL
 157int ll_init(void);
 158int ll_deinit(void);
 159#endif
 160
 161#ifdef CONFIG_BT_HCIUART_ATH3K
 162int ath_init(void);
 163int ath_deinit(void);
 164#endif
 165
 166#ifdef CONFIG_BT_HCIUART_3WIRE
 167int h5_init(void);
 168int h5_deinit(void);
 169#endif
 170
 171#ifdef CONFIG_BT_HCIUART_INTEL
 172int intel_init(void);
 173int intel_deinit(void);
 174#endif
 175
 176#ifdef CONFIG_BT_HCIUART_BCM
 177int bcm_init(void);
 178int bcm_deinit(void);
 179#endif
 180
 181#ifdef CONFIG_BT_HCIUART_QCA
 182int qca_init(void);
 183int qca_deinit(void);
 184#endif
 185