1 /*	$OpenBSD: if_ubtreg.h,v 1.1 2005/01/14 12:21:02 grange Exp $	*/
2 
3 /*
4  * ng_ubt_var.h
5  *
6  * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * $Id: if_ubtreg.h,v 1.1 2005/01/14 12:21:02 grange Exp $
31  * $FreeBSD: src/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h,v 1.4 2004/10/12 23:33:46 emax Exp $
32  */
33 
34 #ifndef _NG_UBT_VAR_H_
35 #define _NG_UBT_VAR_H_
36 
37 /**************************************************************************
38  **************************************************************************
39  **     Netgraph node hook name, type name and type cookie and commands
40  **************************************************************************
41  **************************************************************************/
42 
43 #define NG_UBT_NODE_TYPE	"ubt"
44 #define NG_UBT_HOOK		"hook"
45 
46 #define NGM_UBT_COOKIE		1021837971
47 
48 /* Debug levels */
49 #define NG_UBT_ALERT_LEVEL	1
50 #define NG_UBT_ERR_LEVEL	2
51 #define NG_UBT_WARN_LEVEL	3
52 #define NG_UBT_INFO_LEVEL	4
53 
54 /**************************************************************************
55  **************************************************************************
56  **                    UBT node command/event parameters
57  **************************************************************************
58  **************************************************************************/
59 
60 #define NGM_UBT_NODE_SET_DEBUG	1		/* set debug level */
61 #define NGM_UBT_NODE_GET_DEBUG	2		/* get debug level */
62 typedef u_int16_t		ng_ubt_node_debug_ep;
63 
64 #define NGM_UBT_NODE_SET_QLEN	3		/* set queue length */
65 #define NGM_UBT_NODE_GET_QLEN	4		/* get queue length */
66 typedef struct {
67 	int32_t		queue;			/* queue index */
68 #define	NGM_UBT_NODE_QUEUE_CMD	1		/* commands */
69 #define	NGM_UBT_NODE_QUEUE_ACL	2		/* ACL data */
70 #define	NGM_UBT_NODE_QUEUE_SCO	3		/* SCO data */
71 
72 	int32_t		qlen;			/* queue length */
73 } ng_ubt_node_qlen_ep;
74 
75 #define NGM_UBT_NODE_GET_STAT	5		/* get statistic */
76 typedef struct {
77 	u_int32_t	pckts_recv;		/* # of packets received */
78 	u_int32_t	bytes_recv;		/* # of bytes received */
79 	u_int32_t	pckts_sent;		/* # of packets sent */
80 	u_int32_t	bytes_sent;		/* # of bytes sent */
81 	u_int32_t	oerrors;		/* # of output errors */
82 	u_int32_t	ierrors;		/* # of input errors */
83 } ng_ubt_node_stat_ep;
84 
85 #define NGM_UBT_NODE_RESET_STAT	6		/* reset statistic */
86 
87 #define NGM_UBT_NODE_DEV_NODES	7		/* on/off device interface */
88 typedef u_int16_t	ng_ubt_node_dev_nodes_ep;
89 
90 /* pullup wrapper */
91 #define NG_UBT_M_PULLUP(m, s) \
92 	do { \
93 		if ((m)->m_len < (s)) \
94 			(m) = m_pullup((m), (s)); \
95 		if ((m) == NULL) \
96 			NG_UBT_ALERT("%s: %s - m_pullup(%d) failed\n", \
97 				__func__, USBDEVNAME(sc->sc_dev), (s)); \
98 	} while (0)
99 
100 /* Debug printf's */
101 #define NG_UBT_ALERT	if (sc->sc_debug >= NG_UBT_ALERT_LEVEL) printf
102 #define NG_UBT_ERR	if (sc->sc_debug >= NG_UBT_ERR_LEVEL)   printf
103 #define NG_UBT_WARN	if (sc->sc_debug >= NG_UBT_WARN_LEVEL)  printf
104 #define NG_UBT_INFO	if (sc->sc_debug >= NG_UBT_INFO_LEVEL)  printf
105 
106 /* Bluetooth USB control request type */
107 #define UBT_HCI_REQUEST		0x20
108 #define UBT_DEFAULT_QLEN	12
109 
110 /* USB device softc structure */
111 struct ubt_softc {
112 	USBBASEDEVICE		 sc_dev;	/* pointer back to USB device */
113 
114 	/* State */
115 	ng_ubt_node_debug_ep	 sc_debug;	/* debug level */
116 	u_int32_t		 sc_flags;	/* device flags */
117 #define UBT_NEED_FRAME_TYPE	(1 << 0)	/* device required frame type */
118 #define UBT_HAVE_FRAME_TYPE UBT_NEED_FRAME_TYPE
119 #define UBT_CMD_XMIT		(1 << 1)	/* CMD xmit in progress */
120 #define UBT_ACL_XMIT		(1 << 2)	/* ACL xmit in progress */
121 #define UBT_SCO_XMIT		(1 << 3)	/* SCO xmit in progress */
122 #define UBT_EVT_RECV		(1 << 4)	/* EVN recv in progress */
123 #define UBT_ACL_RECV		(1 << 5)	/* ACL recv in progress */
124 #define UBT_SCO_RECV		(1 << 6)	/* SCO recv in progress */
125 #define UBT_CTRL_DEV		(1 << 7)	/* ctrl device is open */
126 #define UBT_INTR_DEV		(1 << 8)	/* intr device is open */
127 #define UBT_BULK_DEV		(1 << 9)	/* bulk device is open */
128 #define UBT_ANY_DEV		(UBT_CTRL_DEV|UBT_INTR_DEV|UBT_BULK_DEV)
129 
130 	ng_ubt_node_stat_ep	 sc_stat;	/* statistic */
131 #define NG_UBT_STAT_PCKTS_SENT(s)	(s).pckts_sent ++
132 #define NG_UBT_STAT_BYTES_SENT(s, n)	(s).bytes_sent += (n)
133 #define NG_UBT_STAT_PCKTS_RECV(s)	(s).pckts_recv ++
134 #define NG_UBT_STAT_BYTES_RECV(s, n)	(s).bytes_recv += (n)
135 #define NG_UBT_STAT_OERROR(s)		(s).oerrors ++
136 #define NG_UBT_STAT_IERROR(s)		(s).ierrors ++
137 #define NG_UBT_STAT_RESET(s)		bzero(&(s), sizeof((s)))
138 
139 	/* USB device specific */
140 	usbd_device_handle	 sc_udev;	/* USB device handle */
141 
142 	usbd_interface_handle	 sc_iface0;	/* USB interface 0 */
143 	usbd_interface_handle	 sc_iface1;	/* USB interface 1 */
144 
145 	/* Interrupt pipe (HCI events) */
146 	int			 sc_intr_ep;	/* interrupt endpoint */
147 	usbd_pipe_handle	 sc_intr_pipe;	/* interrupt pipe handle */
148 	usbd_xfer_handle	 sc_intr_xfer;	/* intr xfer */
149 	struct mbuf		*sc_intr_mbuf;	/* interrupt mbuf */
150 	void			*sc_intr_buffer; /* interrupt buffer */
151 #define UBT_INTR_BUFFER_SIZE MCLBYTES
152 
153 	/* Control pipe (HCI commands) */
154 	usbd_xfer_handle	 sc_ctrl_xfer;	/* control xfer handle */
155 	void			*sc_ctrl_buffer; /* control buffer */
156 	struct ng_bt_mbufq	 sc_cmdq;	/* HCI command queue */
157 #define UBT_CTRL_BUFFER_SIZE \
158 		(sizeof(ng_hci_cmd_pkt_t) + NG_HCI_CMD_PKT_SIZE)
159 
160 	/* Bulk in pipe (ACL data) */
161 	int			 sc_bulk_in_ep;	/* bulk-in enpoint */
162 	usbd_pipe_handle	 sc_bulk_in_pipe; /* bulk-in pipe */
163 	usbd_xfer_handle	 sc_bulk_in_xfer; /* bulk-in xfer */
164 	struct mbuf		*sc_bulk_in_mbuf; /* bulk-in mbuf */
165 	void			*sc_bulk_in_buffer; /* bulk-in buffer */
166 
167 	/* Bulk out pipe (ACL data) */
168 	int			 sc_bulk_out_ep; /* bulk-out endpoint */
169 	usbd_pipe_handle	 sc_bulk_out_pipe; /* bulk-out pipe */
170 	usbd_xfer_handle	 sc_bulk_out_xfer; /* bulk-out xfer */
171 	void			*sc_bulk_out_buffer; /* bulk-out buffer */
172 	struct ng_bt_mbufq	 sc_aclq;	/* ACL data queue */
173 #define UBT_BULK_BUFFER_SIZE \
174 		MCLBYTES /* XXX should be big enough to hold one frame */
175 
176 	/* Isoc. in pipe (SCO data) */
177 	int			 sc_isoc_in_ep; /* isoc-in endpoint */
178 	usbd_pipe_handle	 sc_isoc_in_pipe; /* isoc-in pipe */
179 	usbd_xfer_handle	 sc_isoc_in_xfer; /* isoc-in xfer */
180 	void			*sc_isoc_in_buffer; /* isoc-in buffer */
181 	u_int16_t		*sc_isoc_in_frlen; /* isoc-in. frame length */
182 
183 	/* Isoc. out pipe (ACL data) */
184 	int			 sc_isoc_out_ep; /* isoc-out endpoint */
185 	usbd_pipe_handle	 sc_isoc_out_pipe; /* isoc-out pipe */
186 	usbd_xfer_handle	 sc_isoc_out_xfer; /* isoc-out xfer */
187 	void			*sc_isoc_out_buffer; /* isoc-in buffer */
188 	u_int16_t		*sc_isoc_out_frlen; /* isoc-out. frame length */
189 	struct ng_bt_mbufq	 sc_scoq;	/* SCO data queue */
190 
191 	int			 sc_isoc_size; /* max. size of isoc. packet */
192 	u_int32_t		 sc_isoc_nframes; /* num. isoc. frames */
193 #define UBT_ISOC_BUFFER_SIZE \
194 		(sizeof(ng_hci_scodata_pkt_t) + NG_HCI_SCO_PKT_SIZE)
195 
196 #if 0
197 	/* Netgraph specific */
198 	node_p			 sc_node;	/* pointer back to node */
199 	hook_p			 sc_hook;	/* upstream hook */
200 #endif
201 
202 	struct ifnet		sc_if;
203 };
204 typedef struct ubt_softc	ubt_softc_t;
205 typedef struct ubt_softc *	ubt_softc_p;
206 
207 #endif /* ndef _NG_UBT_VAR_H_ */
208