Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/bluetooth/hci_uart.h
26378 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
*
4
* Bluetooth HCI UART driver
5
*
6
* Copyright (C) 2000-2001 Qualcomm Incorporated
7
* Copyright (C) 2002-2003 Maxim Krasnyansky <[email protected]>
8
* Copyright (C) 2004-2005 Marcel Holtmann <[email protected]>
9
*/
10
11
#ifndef N_HCI
12
#define N_HCI 15
13
#endif
14
15
/* Ioctls */
16
#define HCIUARTSETPROTO _IOW('U', 200, int)
17
#define HCIUARTGETPROTO _IOR('U', 201, int)
18
#define HCIUARTGETDEVICE _IOR('U', 202, int)
19
#define HCIUARTSETFLAGS _IOW('U', 203, int)
20
#define HCIUARTGETFLAGS _IOR('U', 204, int)
21
22
/* UART protocols */
23
#define HCI_UART_MAX_PROTO 13
24
25
#define HCI_UART_H4 0
26
#define HCI_UART_BCSP 1
27
#define HCI_UART_3WIRE 2
28
#define HCI_UART_H4DS 3
29
#define HCI_UART_LL 4
30
#define HCI_UART_ATH3K 5
31
#define HCI_UART_INTEL 6
32
#define HCI_UART_BCM 7
33
#define HCI_UART_QCA 8
34
#define HCI_UART_AG6XX 9
35
#define HCI_UART_NOKIA 10
36
#define HCI_UART_MRVL 11
37
#define HCI_UART_AML 12
38
39
#define HCI_UART_RAW_DEVICE 0
40
#define HCI_UART_RESET_ON_INIT 1
41
#define HCI_UART_INIT_PENDING 3
42
#define HCI_UART_EXT_CONFIG 4
43
#define HCI_UART_VND_DETECT 5
44
45
struct hci_uart;
46
struct serdev_device;
47
48
struct hci_uart_proto {
49
unsigned int id;
50
const char *name;
51
unsigned int manufacturer;
52
unsigned int init_speed;
53
unsigned int oper_speed;
54
int (*open)(struct hci_uart *hu);
55
int (*close)(struct hci_uart *hu);
56
int (*flush)(struct hci_uart *hu);
57
int (*setup)(struct hci_uart *hu);
58
int (*set_baudrate)(struct hci_uart *hu, unsigned int speed);
59
int (*recv)(struct hci_uart *hu, const void *data, int len);
60
int (*enqueue)(struct hci_uart *hu, struct sk_buff *skb);
61
struct sk_buff *(*dequeue)(struct hci_uart *hu);
62
};
63
64
struct hci_uart {
65
struct tty_struct *tty;
66
struct serdev_device *serdev;
67
struct hci_dev *hdev;
68
unsigned long flags;
69
unsigned long hdev_flags;
70
71
struct work_struct init_ready;
72
struct work_struct write_work;
73
74
const struct hci_uart_proto *proto;
75
struct percpu_rw_semaphore proto_lock; /* Stop work for proto close */
76
void *priv;
77
78
struct sk_buff *tx_skb;
79
unsigned long tx_state;
80
81
unsigned int init_speed;
82
unsigned int oper_speed;
83
84
u8 alignment;
85
u8 padding;
86
};
87
88
/* HCI_UART proto flag bits */
89
#define HCI_UART_PROTO_SET 0
90
#define HCI_UART_REGISTERED 1
91
#define HCI_UART_PROTO_READY 2
92
#define HCI_UART_NO_SUSPEND_NOTIFIER 3
93
#define HCI_UART_PROTO_INIT 4
94
95
/* TX states */
96
#define HCI_UART_SENDING 1
97
#define HCI_UART_TX_WAKEUP 2
98
99
int hci_uart_register_proto(const struct hci_uart_proto *p);
100
int hci_uart_unregister_proto(const struct hci_uart_proto *p);
101
102
int hci_uart_register_device_priv(struct hci_uart *hu,
103
const struct hci_uart_proto *p,
104
int sizeof_priv);
105
106
static inline int hci_uart_register_device(struct hci_uart *hu,
107
const struct hci_uart_proto *p)
108
{
109
return hci_uart_register_device_priv(hu, p, 0);
110
}
111
112
void hci_uart_unregister_device(struct hci_uart *hu);
113
114
int hci_uart_tx_wakeup(struct hci_uart *hu);
115
int hci_uart_wait_until_sent(struct hci_uart *hu);
116
int hci_uart_init_ready(struct hci_uart *hu);
117
void hci_uart_init_work(struct work_struct *work);
118
void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed);
119
bool hci_uart_has_flow_control(struct hci_uart *hu);
120
void hci_uart_set_flow_control(struct hci_uart *hu, bool enable);
121
void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed,
122
unsigned int oper_speed);
123
124
#ifdef CONFIG_BT_HCIUART_H4
125
int h4_init(void);
126
int h4_deinit(void);
127
128
struct h4_recv_pkt {
129
u8 type; /* Packet type */
130
u8 hlen; /* Header length */
131
u8 loff; /* Data length offset in header */
132
u8 lsize; /* Data length field size */
133
u16 maxlen; /* Max overall packet length */
134
int (*recv)(struct hci_dev *hdev, struct sk_buff *skb);
135
};
136
137
#define H4_RECV_ACL \
138
.type = HCI_ACLDATA_PKT, \
139
.hlen = HCI_ACL_HDR_SIZE, \
140
.loff = 2, \
141
.lsize = 2, \
142
.maxlen = HCI_MAX_FRAME_SIZE \
143
144
#define H4_RECV_SCO \
145
.type = HCI_SCODATA_PKT, \
146
.hlen = HCI_SCO_HDR_SIZE, \
147
.loff = 2, \
148
.lsize = 1, \
149
.maxlen = HCI_MAX_SCO_SIZE
150
151
#define H4_RECV_EVENT \
152
.type = HCI_EVENT_PKT, \
153
.hlen = HCI_EVENT_HDR_SIZE, \
154
.loff = 1, \
155
.lsize = 1, \
156
.maxlen = HCI_MAX_EVENT_SIZE
157
158
#define H4_RECV_ISO \
159
.type = HCI_ISODATA_PKT, \
160
.hlen = HCI_ISO_HDR_SIZE, \
161
.loff = 2, \
162
.lsize = 2, \
163
.maxlen = HCI_MAX_FRAME_SIZE \
164
165
struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
166
const unsigned char *buffer, int count,
167
const struct h4_recv_pkt *pkts, int pkts_count);
168
#endif
169
170
#ifdef CONFIG_BT_HCIUART_BCSP
171
int bcsp_init(void);
172
int bcsp_deinit(void);
173
#endif
174
175
#ifdef CONFIG_BT_HCIUART_LL
176
int ll_init(void);
177
int ll_deinit(void);
178
#endif
179
180
#ifdef CONFIG_BT_HCIUART_ATH3K
181
int ath_init(void);
182
int ath_deinit(void);
183
#endif
184
185
#ifdef CONFIG_BT_HCIUART_3WIRE
186
int h5_init(void);
187
int h5_deinit(void);
188
#endif
189
190
#ifdef CONFIG_BT_HCIUART_INTEL
191
int intel_init(void);
192
int intel_deinit(void);
193
#endif
194
195
#ifdef CONFIG_BT_HCIUART_BCM
196
int bcm_init(void);
197
int bcm_deinit(void);
198
#endif
199
200
#ifdef CONFIG_BT_HCIUART_QCA
201
int qca_init(void);
202
int qca_deinit(void);
203
#endif
204
205
#ifdef CONFIG_BT_HCIUART_AG6XX
206
int ag6xx_init(void);
207
int ag6xx_deinit(void);
208
#endif
209
210
#ifdef CONFIG_BT_HCIUART_MRVL
211
int mrvl_init(void);
212
int mrvl_deinit(void);
213
#endif
214
215
#ifdef CONFIG_BT_HCIUART_AML
216
int aml_init(void);
217
int aml_deinit(void);
218
#endif
219
220