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 <maxk@qualcomm.com> |
8 | * Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org> |
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 12 |
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 | |
38 | #define HCI_UART_RAW_DEVICE 0 |
39 | #define HCI_UART_RESET_ON_INIT 1 |
40 | #define HCI_UART_CREATE_AMP 2 |
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 | |
94 | /* TX states */ |
95 | #define HCI_UART_SENDING 1 |
96 | #define HCI_UART_TX_WAKEUP 2 |
97 | |
98 | int hci_uart_register_proto(const struct hci_uart_proto *p); |
99 | int hci_uart_unregister_proto(const struct hci_uart_proto *p); |
100 | int hci_uart_register_device(struct hci_uart *hu, const struct hci_uart_proto *p); |
101 | void hci_uart_unregister_device(struct hci_uart *hu); |
102 | |
103 | int hci_uart_tx_wakeup(struct hci_uart *hu); |
104 | int hci_uart_wait_until_sent(struct hci_uart *hu); |
105 | int hci_uart_init_ready(struct hci_uart *hu); |
106 | void hci_uart_init_work(struct work_struct *work); |
107 | void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed); |
108 | bool hci_uart_has_flow_control(struct hci_uart *hu); |
109 | void hci_uart_set_flow_control(struct hci_uart *hu, bool enable); |
110 | void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed, |
111 | unsigned int oper_speed); |
112 | |
113 | #ifdef CONFIG_BT_HCIUART_H4 |
114 | int h4_init(void); |
115 | int h4_deinit(void); |
116 | |
117 | struct h4_recv_pkt { |
118 | u8 type; /* Packet type */ |
119 | u8 hlen; /* Header length */ |
120 | u8 loff; /* Data length offset in header */ |
121 | u8 lsize; /* Data length field size */ |
122 | u16 maxlen; /* Max overall packet length */ |
123 | int (*recv)(struct hci_dev *hdev, struct sk_buff *skb); |
124 | }; |
125 | |
126 | #define H4_RECV_ACL \ |
127 | .type = HCI_ACLDATA_PKT, \ |
128 | .hlen = HCI_ACL_HDR_SIZE, \ |
129 | .loff = 2, \ |
130 | .lsize = 2, \ |
131 | .maxlen = HCI_MAX_FRAME_SIZE \ |
132 | |
133 | #define H4_RECV_SCO \ |
134 | .type = HCI_SCODATA_PKT, \ |
135 | .hlen = HCI_SCO_HDR_SIZE, \ |
136 | .loff = 2, \ |
137 | .lsize = 1, \ |
138 | .maxlen = HCI_MAX_SCO_SIZE |
139 | |
140 | #define H4_RECV_EVENT \ |
141 | .type = HCI_EVENT_PKT, \ |
142 | .hlen = HCI_EVENT_HDR_SIZE, \ |
143 | .loff = 1, \ |
144 | .lsize = 1, \ |
145 | .maxlen = HCI_MAX_EVENT_SIZE |
146 | |
147 | #define H4_RECV_ISO \ |
148 | .type = HCI_ISODATA_PKT, \ |
149 | .hlen = HCI_ISO_HDR_SIZE, \ |
150 | .loff = 2, \ |
151 | .lsize = 2, \ |
152 | .maxlen = HCI_MAX_FRAME_SIZE \ |
153 | |
154 | struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, |
155 | const unsigned char *buffer, int count, |
156 | const struct h4_recv_pkt *pkts, int pkts_count); |
157 | #endif |
158 | |
159 | #ifdef CONFIG_BT_HCIUART_BCSP |
160 | int bcsp_init(void); |
161 | int bcsp_deinit(void); |
162 | #endif |
163 | |
164 | #ifdef CONFIG_BT_HCIUART_LL |
165 | int ll_init(void); |
166 | int ll_deinit(void); |
167 | #endif |
168 | |
169 | #ifdef CONFIG_BT_HCIUART_ATH3K |
170 | int ath_init(void); |
171 | int ath_deinit(void); |
172 | #endif |
173 | |
174 | #ifdef CONFIG_BT_HCIUART_3WIRE |
175 | int h5_init(void); |
176 | int h5_deinit(void); |
177 | #endif |
178 | |
179 | #ifdef CONFIG_BT_HCIUART_INTEL |
180 | int intel_init(void); |
181 | int intel_deinit(void); |
182 | #endif |
183 | |
184 | #ifdef CONFIG_BT_HCIUART_BCM |
185 | int bcm_init(void); |
186 | int bcm_deinit(void); |
187 | #endif |
188 | |
189 | #ifdef CONFIG_BT_HCIUART_QCA |
190 | int qca_init(void); |
191 | int qca_deinit(void); |
192 | #endif |
193 | |
194 | #ifdef CONFIG_BT_HCIUART_AG6XX |
195 | int ag6xx_init(void); |
196 | int ag6xx_deinit(void); |
197 | #endif |
198 | |
199 | #ifdef CONFIG_BT_HCIUART_MRVL |
200 | int mrvl_init(void); |
201 | int mrvl_deinit(void); |
202 | #endif |
203 | |