1/* $FreeBSD$ */
2
3/*-
4 * Copyright (c) 2011 Anybots Inc
5 * written by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
6 *  - ucom part is based on u3g.c
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef _IF_USEVAR_H_
31#define	_IF_USEVAR_H_
32
33#define	USIE_DCD		0x0001
34#define	USIE_DSR		0x0002
35#define	USIE_DTR		0x0004
36#define	USIE_RI			0x0008
37#define	USIE_CTS		0x0100
38#define	USIE_RTS		0x0200
39
40#define	USIE_HIP_FRM_CHR	0x7e
41#define	USIE_HIP_ESC_CHR	0x7d
42#define	USIE_HIP_IF		0
43
44#define	USIE_HIPCNS_MIN		16	/* HIP + CnS + 2 framing char */
45#define	USIE_HIPCNS_MAX		261	/* HIP + max CnS 255 + 2 framing char */
46
47#define	USIE_CNFG_INDEX		0
48#define	USIE_IFACE_INDEX	0
49#define	USIE_IFACE_MAX		12
50#define	USIE_BUFSIZE		2048
51#define	USIE_MTU_MAX		1500
52#define	USIE_RXSZ_MAX		4096
53
54/* USB control pipe request */
55#define	USIE_POWER		0x00
56#define	USIE_FW_ATTR		0x06
57#define	USIE_NMEA		0x07
58#define	USIE_LINK_STATE		0x22
59
60/* firmware attr flags */
61#define	USIE_PM_AUTO		(1 << 1)
62#define	USIE_FW_DHCP		(1 << 3)	/* DHCP capable */
63
64/* line state flags */
65#define	USIE_LS_DTR		(1 << 0)
66#define	USIE_LS_RTS		(1 << 1)
67
68/* Host Interface Porotocol Header */
69struct usie_hip {
70	uint16_t len;
71#define	USIE_HIP_LEN_MASK	0x3fff
72#define	USIE_HIP_IP_LEN_MASK	0x07ff
73
74	uint8_t	id;
75#define	USIE_HIP_PAD		(1 << 7)
76#define	USIE_HIP_MASK		0x7f
77#define	USIE_HIP_SYNC2M		0x20	/* host -> modem */
78#define	USIE_HIP_DOWN		0x26
79#define	USIE_HIP_CNS2M		0x2b	/* h -> m */
80#define	USIE_HIP_CTX		0x3f
81#define	USIE_HIP_SYNC2H		0x60	/* h <- m */
82#define	USIE_HIP_RESTR		0x62
83#define	USIE_HIP_RCGI		0x64
84#define	USIE_HIP_CNS2H		0x6b	/* h <- m */
85#define	USIE_HIP_UMTS		0x78
86#define	USIE_HIP_IP		0x7f
87
88	uint8_t	param;
89} __packed __aligned(4);
90
91/* Control and Status Header */
92struct usie_cns {
93	uint16_t obj;			/* object type */
94#define	USIE_CNS_OB_RSSI	0x1001	/* read RSSI */
95#define	USIE_CNS_OB_HW_DISABLE	0x1011	/* disable h/w */
96#define	USIE_CNS_OB_PW_SW	0x1071	/* power on/off */
97#define	USIE_CNS_OB_PROF_WRITE	0x7003	/* write profile */
98#define	USIE_CNS_OB_LINK_UPDATE	0x7004	/* dis/connect */
99#define	USIE_CNS_OB_PDP_READ	0x7006	/* read out IP addr */
100
101	uint8_t	op;			/* operation type */
102#define	USIE_CNS_OP_ERR		(1 << 7)/* | == error */
103#define	USIE_CNS_OP_REQ		0x01	/* host -> modem */
104#define	USIE_CNS_OP_RSP		0x02	/* h <- m */
105#define	USIE_CNS_OP_SET		0x03	/* h -> m */
106#define	USIE_CNS_OP_ACK		0x04	/* h <- m */
107#define	USIE_CNS_OP_NOTIF_ON	0x05	/* h -> m */
108#define	USIE_CNS_OP_RSP_ON	0x06	/* h <- m */
109#define	USIE_CNS_OP_NOTIF	0x07	/* h <- m */
110#define	USIE_CNS_OP_NOTIF_OFF	0x08	/* h -> m */
111#define	USIE_CNS_OP_RSP_OFF	0x09	/* h <- m */
112#define	USIE_CNS_OP_REQ_CHG	0x0a	/* h -> m */
113#define	USIE_CNS_OP_RSP_CHG	0x0b	/* h <- m */
114
115	uint8_t	rsv0;			/* reserved, always '0' */
116	uint32_t id;			/* caller ID */
117/*
118 * .id is to identify calling functions
119 * h/w responses with the same .id used in request. Only '0' is reserved
120 * for notification (asynchronous message generated by h/w without any
121 * request). All other values are user defineable.
122 */
123#define	USIE_CNS_ID_NOTIF	0x00000000	/* reserved */
124#define	USIE_CNS_ID_INIT	0x00000001
125#define	USIE_CNS_ID_STOP	0x00000002
126#define	USIE_CNS_ID_DNS		0x00000003
127#define	USIE_CNS_ID_RSSI	0x00000004
128
129	uint8_t	rsv1;			/* reserved, always '0' */
130	uint8_t	len;			/* length of param */
131} __packed;
132
133/*
134 * CnS param attached to struct usie_cns
135 * usie_cns.len is total size of this param
136 * max 255
137 */
138#define	USIE_CNS_PM_UP		0x01
139#define	USIE_CNS_PM_DOWN	0x00
140
141/* Link Sense Indication data structure */
142struct usie_lsi {
143	uint8_t	proto;
144#define	USIE_LSI_UMTS		0x01
145
146	uint8_t	pad0;
147	uint16_t len;
148	uint8_t	area;
149#define	USIE_LSI_AREA_NO	0x00
150#define	USIE_LSI_AREA_NODATA	0x01
151
152	uint8_t	pad1[41];
153	uint8_t	state;
154#define	USIE_LSI_STATE_IDLE	0x00
155
156	uint8_t	pad2[33];
157	uint8_t	type;
158#define	USIE_LSI_IP4		0x00
159
160	uint8_t	pdp_addr_len;		/* PDP addr */
161	uint8_t	pdp_addr[16];
162	uint8_t	pad3[23];
163	uint8_t	dns1_addr_len;		/* DNS addr */
164	uint8_t	dns1_addr[16];
165	uint8_t	dns2_addr_len;
166	uint8_t	dns2_addr[16];
167	uint8_t	wins1_addr_len;		/* Wins addr */
168	uint8_t	wins1_addr[16];
169	uint8_t	wins2_addr_len;
170	uint8_t	wins2_addr[16];
171	uint8_t	pad4[4];
172	uint8_t	gw_addr_len;		/* GW addr */
173	uint8_t	gw_addr[16];
174	uint8_t	rsv[8];
175} __packed;
176
177struct usie_net_info {
178	uint8_t	addr_len;
179	uint8_t	pdp_addr[16];
180	uint8_t	dns1_addr[16];
181	uint8_t	dns2_addr[16];
182	uint8_t	gw_addr[16];
183} __packed;
184
185/* Tx/Rx IP packet descriptor */
186struct usie_desc {
187	struct usie_hip hip;
188	uint16_t desc_type;
189#define	USIE_TYPE_MASK	0x03ff
190#define	USIE_IP_TX	0x0002
191#define	USIE_IP_RX	0x0202
192
193	struct ether_header ethhdr;
194} __packed;
195
196enum {
197	USIE_UC_STATUS,
198	USIE_UC_RX,
199	USIE_UC_TX,
200	USIE_UC_N_XFER
201};
202
203enum {
204	USIE_IF_STATUS,
205	USIE_IF_RX,
206	USIE_IF_TX,
207	USIE_IF_N_XFER
208};
209
210struct usie_softc {
211	struct ucom_super_softc sc_super_ucom;
212
213#define	USIE_UCOM_MAX	6
214	struct ucom_softc sc_ucom[USIE_UCOM_MAX];
215	uint8_t	sc_uc_ifnum[USIE_UCOM_MAX];
216
217	struct mtx sc_mtx;
218
219	struct task sc_if_status_task;
220	struct task sc_if_sync_task;
221	struct usb_callout sc_if_sync_ch;
222
223	struct usie_net_info sc_net;
224
225	struct usie_desc sc_txd;
226
227	struct usb_xfer *sc_uc_xfer[USIE_UCOM_MAX][USIE_UC_N_XFER];
228	struct usb_xfer *sc_if_xfer[USIE_IF_N_XFER];
229
230	struct ifnet *sc_ifp;
231	struct usb_device *sc_udev;
232	device_t sc_dev;
233
234	struct mbuf *sc_rxm;
235
236	uint16_t sc_if_ifnum;
237
238	int16_t	sc_rssi;
239
240	uint8_t	sc_msr;
241	uint8_t	sc_lsr;
242	uint8_t	sc_nucom;
243
244	uint8_t	sc_resp_temp[USIE_BUFSIZE] __aligned(4);
245	uint8_t	sc_status_temp[USIE_BUFSIZE] __aligned(4);
246};
247
248/* Some code assumptions */
249
250extern uint8_t usie_assert[((sizeof(struct usie_hip) +
251    sizeof(struct usie_lsi) + 1) <= USIE_BUFSIZE) ? 1 : -1];
252
253extern uint8_t ucdc_assert[(sizeof(struct usb_cdc_notification)
254     >= 16) ? 1 : -1];
255
256#endif					/* _IF_USEVAR_H_ */
257