summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h
blob: 6fdce0eecd354ab98bab817f4770bd1e92aa1b6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
 * ng_ubt_var.h
 */

/*-
 * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $Id: ng_ubt_var.h,v 1.5 2005/10/31 17:57:44 max Exp $
 * $FreeBSD$
 */

#ifndef _NG_UBT_VAR_H_
#define _NG_UBT_VAR_H_

/* pullup wrapper */
#define NG_UBT_M_PULLUP(m, s) \
	do { \
		if ((m)->m_len < (s)) \
			(m) = m_pullup((m), (s)); \
		if ((m) == NULL) \
			NG_UBT_ALERT("%s: %s - m_pullup(%d) failed\n", \
				__func__, device_get_nameunit(sc->sc_dev), (s)); \
	} while (0)

/* Debug printf's */
#define NG_UBT_ALERT	if (sc->sc_debug >= NG_UBT_ALERT_LEVEL) printf
#define NG_UBT_ERR	if (sc->sc_debug >= NG_UBT_ERR_LEVEL)   printf
#define NG_UBT_WARN	if (sc->sc_debug >= NG_UBT_WARN_LEVEL)  printf
#define NG_UBT_INFO	if (sc->sc_debug >= NG_UBT_INFO_LEVEL)  printf

/* Bluetooth USB control request type */
#define UBT_HCI_REQUEST		0x20
#define UBT_DEFAULT_QLEN	12

/* Isoc transfers */
#define NG_UBT_NXFERS		3	/* max xfers to queue */
#define NG_UBT_NFRAMES		10	/* frames per xfer */

struct ubt_isoc_xfer {
	usbd_xfer_handle	 xfer;		/* isoc xfer */
	void			*buffer;	/* isoc buffer */
 	uint16_t		*frlen;		/* isoc frame length */
	int			 active;	/* is xfer active */
};
typedef struct ubt_isoc_xfer	ubt_isoc_xfer_t;
typedef struct ubt_isoc_xfer *	ubt_isoc_xfer_p;

/* USB device softc structure */
struct ubt_softc {
	/* State */
	ng_ubt_node_debug_ep	 sc_debug;	/* debug level */
	uint32_t		 sc_flags;	/* device flags */
#define UBT_NEED_FRAME_TYPE	(1 << 0)	/* device required frame type */
#define UBT_HAVE_FRAME_TYPE UBT_NEED_FRAME_TYPE
#define UBT_CMD_XMIT		(1 << 1)	/* CMD xmit in progress */
#define UBT_ACL_XMIT		(1 << 2)	/* ACL xmit in progress */
#define UBT_SCO_XMIT		(1 << 3)	/* SCO xmit in progress */
#define UBT_EVT_RECV		(1 << 4)	/* EVN recv in progress */
#define UBT_ACL_RECV		(1 << 5)	/* ACL recv in progress */
#define UBT_SCO_RECV		(1 << 6)	/* SCO recv in progress */

	ng_ubt_node_stat_ep	 sc_stat;	/* statistic */
#define NG_UBT_STAT_PCKTS_SENT(s)	(s).pckts_sent ++
#define NG_UBT_STAT_BYTES_SENT(s, n)	(s).bytes_sent += (n)
#define NG_UBT_STAT_PCKTS_RECV(s)	(s).pckts_recv ++
#define NG_UBT_STAT_BYTES_RECV(s, n)	(s).bytes_recv += (n)
#define NG_UBT_STAT_OERROR(s)		(s).oerrors ++
#define NG_UBT_STAT_IERROR(s)		(s).ierrors ++
#define NG_UBT_STAT_RESET(s)		bzero(&(s), sizeof((s)))

	/* USB device specific */
	device_t		 sc_dev;	/* pointer back to USB device */
	usbd_device_handle	 sc_udev;	/* USB device handle */

	usbd_interface_handle	 sc_iface0;	/* USB interface 0 */
	usbd_interface_handle	 sc_iface1;	/* USB interface 1 */

	/* Interrupt pipe (HCI events) */
	int			 sc_intr_ep;	/* interrupt endpoint */
	usbd_pipe_handle	 sc_intr_pipe;	/* interrupt pipe handle */
	usbd_xfer_handle	 sc_intr_xfer;	/* intr xfer */
	struct mbuf		*sc_intr_buffer; /* interrupt buffer */

	/* Control pipe (HCI commands) */
	usbd_xfer_handle	 sc_ctrl_xfer;	/* control xfer handle */
	void			*sc_ctrl_buffer; /* control buffer */
	struct ng_bt_mbufq	 sc_cmdq;	/* HCI command queue */
#define UBT_CTRL_BUFFER_SIZE \
		(sizeof(ng_hci_cmd_pkt_t) + NG_HCI_CMD_PKT_SIZE)

	/* Bulk in pipe (ACL data) */
	int			 sc_bulk_in_ep;	/* bulk-in enpoint */
	usbd_pipe_handle	 sc_bulk_in_pipe; /* bulk-in pipe */
	usbd_xfer_handle	 sc_bulk_in_xfer; /* bulk-in xfer */
	struct mbuf		*sc_bulk_in_buffer; /* bulk-in buffer */

	/* Bulk out pipe (ACL data) */
	int			 sc_bulk_out_ep; /* bulk-out endpoint */
	usbd_pipe_handle	 sc_bulk_out_pipe; /* bulk-out pipe */
	usbd_xfer_handle	 sc_bulk_out_xfer; /* bulk-out xfer */
	void			*sc_bulk_out_buffer; /* bulk-out buffer */
	struct ng_bt_mbufq	 sc_aclq;	/* ACL data queue */
#define UBT_BULK_BUFFER_SIZE \
		MCLBYTES /* XXX should be big enough to hold one frame */

	/* Isoc. in pipe (SCO data) */
	struct mbuf		*sc_isoc_in_buffer;
	int			 sc_isoc_in_ep; /* isoc-in endpoint */
	usbd_pipe_handle	 sc_isoc_in_pipe; /* isoc-in pipe */
	ubt_isoc_xfer_t		 sc_isoc_in[NG_UBT_NXFERS]; /* isoc-in xfers */

	/* Isoc. out pipe (SCO data) */
	int			 sc_isoc_out_ep; /* isoc-out endpoint */
	usbd_pipe_handle	 sc_isoc_out_pipe; /* isoc-out pipe */
	ubt_isoc_xfer_t		 sc_isoc_out[NG_UBT_NXFERS]; /* isoc-out xfers */
	struct ng_bt_mbufq	 sc_scoq;	/* SCO data queue */

	int			 sc_isoc_size; /* max. size of isoc. packet */
#define UBT_ISOC_BUFFER_SIZE \
		(sizeof(ng_hci_scodata_pkt_t) + NG_HCI_SCO_PKT_SIZE)
	
	/* Netgraph specific */
	node_p			 sc_node;	/* pointer back to node */
	hook_p			 sc_hook;	/* upstream hook */
};
typedef struct ubt_softc	ubt_softc_t;
typedef struct ubt_softc *	ubt_softc_p;

#endif /* ndef _NG_UBT_VAR_H_ */

OpenPOWER on IntegriCloud