Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h
35065 views
1
/*
2
* ng_ubt_var.h
3
*/
4
5
/*-
6
* SPDX-License-Identifier: BSD-2-Clause
7
*
8
* Copyright (c) 2001-2009 Maksim Yevmenkin <[email protected]>
9
* All rights reserved.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
* SUCH DAMAGE.
31
*
32
* $Id: ng_ubt_var.h,v 1.2 2003/03/22 23:44:36 max Exp $
33
*/
34
35
#ifndef _NG_UBT_VAR_H_
36
#define _NG_UBT_VAR_H_ 1
37
38
/* Debug printf's */
39
#define UBT_DEBUG(level, sc, fmt, ...) \
40
do { \
41
if ((sc)->sc_debug >= (level)) \
42
device_printf((sc)->sc_dev, "%s:%d: " fmt, \
43
__FUNCTION__, __LINE__,## __VA_ARGS__); \
44
} while (0)
45
46
#define UBT_ALERT(...) UBT_DEBUG(NG_UBT_ALERT_LEVEL, __VA_ARGS__)
47
#define UBT_ERR(...) UBT_DEBUG(NG_UBT_ERR_LEVEL, __VA_ARGS__)
48
#define UBT_WARN(...) UBT_DEBUG(NG_UBT_WARN_LEVEL, __VA_ARGS__)
49
#define UBT_INFO(...) UBT_DEBUG(NG_UBT_INFO_LEVEL, __VA_ARGS__)
50
51
#define UBT_NG_LOCK(sc) mtx_lock(&(sc)->sc_ng_mtx)
52
#define UBT_NG_UNLOCK(sc) mtx_unlock(&(sc)->sc_ng_mtx)
53
54
/* Bluetooth USB control request type */
55
#define UBT_HCI_REQUEST 0x20
56
#define UBT_DEFAULT_QLEN 64
57
#define UBT_ISOC_NFRAMES 32 /* should be factor of 8 */
58
59
/* Bluetooth USB defines */
60
enum {
61
/* Interface #0 transfers */
62
UBT_IF_0_BULK_DT_WR = 0,
63
UBT_IF_0_BULK_DT_RD,
64
UBT_IF_0_INTR_DT_RD,
65
UBT_IF_0_CTRL_DT_WR,
66
67
/* Interface #1 transfers */
68
UBT_IF_1_ISOC_DT_RD1,
69
UBT_IF_1_ISOC_DT_RD2,
70
UBT_IF_1_ISOC_DT_WR1,
71
UBT_IF_1_ISOC_DT_WR2,
72
73
UBT_N_TRANSFER, /* total number of transfers */
74
};
75
76
/* USB control request (HCI command) structure */
77
struct ubt_hci_cmd {
78
uint16_t opcode;
79
uint8_t length;
80
uint8_t data[];
81
} __attribute__ ((packed));
82
#define UBT_HCI_CMD_SIZE(cmd) \
83
((cmd)->length + offsetof(struct ubt_hci_cmd, data))
84
85
/* USB interrupt transfer HCI event header structure */
86
struct ubt_hci_evhdr {
87
uint8_t event;
88
uint8_t length;
89
} __attribute__ ((packed));
90
/* USB interrupt transfer (generic HCI event) structure */
91
struct ubt_hci_event {
92
struct ubt_hci_evhdr header;
93
uint8_t data[];
94
} __attribute__ ((packed));
95
/* USB interrupt transfer (HCI command completion event) structure */
96
struct ubt_hci_event_command_compl {
97
struct ubt_hci_evhdr header;
98
uint8_t numpkt;
99
uint16_t opcode;
100
uint8_t data[];
101
} __attribute__ ((packed));
102
#define UBT_HCI_EVENT_SIZE(evt) \
103
((evt)->header.length + offsetof(struct ubt_hci_event, data))
104
#define UBT_HCI_EVENT_COMPL_HEAD_SIZE \
105
(offsetof(struct ubt_hci_event_command_compl, data) - \
106
offsetof(struct ubt_hci_event_command_compl, numpkt))
107
108
109
/* USB device softc structure */
110
struct ubt_softc {
111
device_t sc_dev; /* for debug printf */
112
113
/* State */
114
ng_ubt_node_debug_ep sc_debug; /* debug level */
115
116
ng_ubt_node_stat_ep sc_stat; /* statistic */
117
#define UBT_STAT_PCKTS_SENT(sc) (sc)->sc_stat.pckts_sent ++
118
#define UBT_STAT_BYTES_SENT(sc, n) (sc)->sc_stat.bytes_sent += (n)
119
#define UBT_STAT_PCKTS_RECV(sc) (sc)->sc_stat.pckts_recv ++
120
#define UBT_STAT_BYTES_RECV(sc, n) (sc)->sc_stat.bytes_recv += (n)
121
#define UBT_STAT_OERROR(sc) (sc)->sc_stat.oerrors ++
122
#define UBT_STAT_IERROR(sc) (sc)->sc_stat.ierrors ++
123
#define UBT_STAT_RESET(sc) bzero(&(sc)->sc_stat, sizeof((sc)->sc_stat))
124
125
/* USB device specific */
126
struct mtx sc_if_mtx; /* interfaces lock */
127
struct usb_xfer *sc_xfer[UBT_N_TRANSFER];
128
129
struct mtx sc_ng_mtx; /* lock for shared NG data */
130
131
/* HCI commands */
132
struct ng_bt_mbufq sc_cmdq; /* HCI command queue */
133
#define UBT_CTRL_BUFFER_SIZE (sizeof(struct usb_device_request) + \
134
sizeof(ng_hci_cmd_pkt_t) + NG_HCI_CMD_PKT_SIZE)
135
#define UBT_INTR_BUFFER_SIZE (MCLBYTES-1) /* reserve 1 byte for ID-tag */
136
137
/* ACL data */
138
struct ng_bt_mbufq sc_aclq; /* ACL data queue */
139
#define UBT_BULK_READ_BUFFER_SIZE (MCLBYTES-1) /* reserve 1 byte for ID-tag */
140
#define UBT_BULK_WRITE_BUFFER_SIZE (MCLBYTES)
141
142
/* SCO data */
143
struct ng_bt_mbufq sc_scoq; /* SCO data queue */
144
struct mbuf *sc_isoc_in_buffer; /* SCO reassembly buffer */
145
146
/* Netgraph specific */
147
node_p sc_node; /* pointer back to node */
148
hook_p sc_hook; /* upstream hook */
149
150
/* Glue */
151
int sc_task_flags; /* task flags */
152
#define UBT_FLAG_T_PENDING (1 << 0) /* task pending */
153
#define UBT_FLAG_T_STOP_ALL (1 << 1) /* stop all xfers */
154
#define UBT_FLAG_T_START_ALL (1 << 2) /* start all read and isoc
155
write xfers */
156
#define UBT_FLAG_T_START_CTRL (1 << 3) /* start control xfer (write) */
157
#define UBT_FLAG_T_START_BULK (1 << 4) /* start bulk xfer (write) */
158
159
struct task sc_task;
160
};
161
typedef struct ubt_softc ubt_softc_t;
162
typedef struct ubt_softc * ubt_softc_p;
163
164
usb_error_t ubt_do_hci_request(struct usb_device *, struct ubt_hci_cmd *,
165
void *, usb_timeout_t);
166
167
extern const STRUCT_USB_HOST_ID ubt_rtl_devs[];
168
extern const size_t ubt_rtl_devs_sizeof;
169
170
extern driver_t ubt_driver;
171
172
#endif /* ndef _NG_UBT_VAR_H_ */
173
174