xref: /freebsd-src/sys/dev/usb/net/mbim.h (revision 0f1bf1c22a0c97e84a4db19197a75952487aa20b)
1*0f1bf1c2SAdrian Chadd /*-
2*0f1bf1c2SAdrian Chadd  * SPDX-License-Identifier: BSD-3-Clause
3*0f1bf1c2SAdrian Chadd  *
4*0f1bf1c2SAdrian Chadd  * Original copyright (c) 2016 genua mbH (OpenBSD version)
5*0f1bf1c2SAdrian Chadd  *
6*0f1bf1c2SAdrian Chadd  * Permission to use, copy, modify, and distribute this software for any
7*0f1bf1c2SAdrian Chadd  * purpose with or without fee is hereby granted, provided that the above
8*0f1bf1c2SAdrian Chadd  * copyright notice and this permission notice appear in all copies.
9*0f1bf1c2SAdrian Chadd  *
10*0f1bf1c2SAdrian Chadd  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*0f1bf1c2SAdrian Chadd  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*0f1bf1c2SAdrian Chadd  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*0f1bf1c2SAdrian Chadd  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*0f1bf1c2SAdrian Chadd  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*0f1bf1c2SAdrian Chadd  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*0f1bf1c2SAdrian Chadd  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*0f1bf1c2SAdrian Chadd  *
18*0f1bf1c2SAdrian Chadd  * Copyright (c) 2022 ADISTA SAS (re-write for FreeBSD)
19*0f1bf1c2SAdrian Chadd  *
20*0f1bf1c2SAdrian Chadd  * Re-write for FreeBSD by Pierre Pronchery <pierre@defora.net>
21*0f1bf1c2SAdrian Chadd  *
22*0f1bf1c2SAdrian Chadd  * Redistribution and use in source and binary forms, with or without
23*0f1bf1c2SAdrian Chadd  * modification, are permitted provided that the following conditions are met:
24*0f1bf1c2SAdrian Chadd  *
25*0f1bf1c2SAdrian Chadd  * - Redistributions of source code must retain the above copyright notice,
26*0f1bf1c2SAdrian Chadd  *   this list of conditions and the following disclaimer.
27*0f1bf1c2SAdrian Chadd  * - Redistributions in binary form must reproduce the above copyright notice,
28*0f1bf1c2SAdrian Chadd  *   this list of conditions and the following disclaimer in the documentation
29*0f1bf1c2SAdrian Chadd  *   and/or other materials provided with the distribution.
30*0f1bf1c2SAdrian Chadd  * - Neither the name of the copyright holder nor the names of its contributors
31*0f1bf1c2SAdrian Chadd  *   may be used to endorse or promote products derived from this software
32*0f1bf1c2SAdrian Chadd  *   without specific prior written permission.
33*0f1bf1c2SAdrian Chadd  *
34*0f1bf1c2SAdrian Chadd  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
35*0f1bf1c2SAdrian Chadd  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36*0f1bf1c2SAdrian Chadd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37*0f1bf1c2SAdrian Chadd  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
38*0f1bf1c2SAdrian Chadd  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
39*0f1bf1c2SAdrian Chadd  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40*0f1bf1c2SAdrian Chadd  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41*0f1bf1c2SAdrian Chadd  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
42*0f1bf1c2SAdrian Chadd  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43*0f1bf1c2SAdrian Chadd  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
44*0f1bf1c2SAdrian Chadd  * POSSIBILITY OF SUCH DAMAGE.
45*0f1bf1c2SAdrian Chadd  *
46*0f1bf1c2SAdrian Chadd  * $OpenBSD: mbim.h,v 1.4 2017/04/18 13:27:55 gerhard Exp $
47*0f1bf1c2SAdrian Chadd  */
48*0f1bf1c2SAdrian Chadd 
49*0f1bf1c2SAdrian Chadd /*
50*0f1bf1c2SAdrian Chadd  * Mobile Broadband Interface Model
51*0f1bf1c2SAdrian Chadd  * http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
52*0f1bf1c2SAdrian Chadd  */
53*0f1bf1c2SAdrian Chadd 
54*0f1bf1c2SAdrian Chadd #ifndef _MBIM_H_
55*0f1bf1c2SAdrian Chadd #define _MBIM_H_
56*0f1bf1c2SAdrian Chadd 
57*0f1bf1c2SAdrian Chadd #define UDESCSUB_MBIM			27
58*0f1bf1c2SAdrian Chadd #define MBIM_INTERFACE_ALTSETTING	1
59*0f1bf1c2SAdrian Chadd 
60*0f1bf1c2SAdrian Chadd #define MBIM_RESET_FUNCTION		0x05
61*0f1bf1c2SAdrian Chadd 
62*0f1bf1c2SAdrian Chadd /*
63*0f1bf1c2SAdrian Chadd  * Registration state (MBIM_REGISTER_STATE)
64*0f1bf1c2SAdrian Chadd  */
65*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_UNKNOWN			0
66*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_DEREGISTERED		1
67*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_SEARCHING			2
68*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_HOME			3
69*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_ROAMING			4
70*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_PARTNER			5
71*0f1bf1c2SAdrian Chadd #define MBIM_REGSTATE_DENIED			6
72*0f1bf1c2SAdrian Chadd 
73*0f1bf1c2SAdrian Chadd /*
74*0f1bf1c2SAdrian Chadd  * Data classes mask (MBIM_DATA_CLASS)
75*0f1bf1c2SAdrian Chadd  */
76*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_NONE			0x00000000
77*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_GPRS			0x00000001
78*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_EDGE			0x00000002
79*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_UMTS			0x00000004
80*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_HSDPA			0x00000008
81*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_HSUPA			0x00000010
82*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_LTE			0x00000020
83*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_1XRTT			0x00010000
84*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_1XEVDO			0x00020000
85*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_1XEVDO_REV_A		0x00040000
86*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_1XEVDV			0x00080000
87*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_3XRTT			0x00100000
88*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_1XEVDO_REV_B		0x00200000
89*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_UMB			0x00400000
90*0f1bf1c2SAdrian Chadd #define MBIM_DATACLASS_CUSTOM			0x80000000
91*0f1bf1c2SAdrian Chadd 
92*0f1bf1c2SAdrian Chadd /*
93*0f1bf1c2SAdrian Chadd  * Cell classes mask (MBIM_CELLULAR_CLASS)
94*0f1bf1c2SAdrian Chadd  */
95*0f1bf1c2SAdrian Chadd #define MBIM_CELLCLASS_GSM			0x00000001
96*0f1bf1c2SAdrian Chadd #define MBIM_CELLCLASS_CDMA			0x00000002
97*0f1bf1c2SAdrian Chadd 
98*0f1bf1c2SAdrian Chadd /*
99*0f1bf1c2SAdrian Chadd  * UUIDs
100*0f1bf1c2SAdrian Chadd  */
101*0f1bf1c2SAdrian Chadd #define MBIM_UUID_LEN		16
102*0f1bf1c2SAdrian Chadd 
103*0f1bf1c2SAdrian Chadd #define MBIM_UUID_BASIC_CONNECT {				\
104*0f1bf1c2SAdrian Chadd 		0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f,	\
105*0f1bf1c2SAdrian Chadd 		0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6, 0xdf	\
106*0f1bf1c2SAdrian Chadd 	}
107*0f1bf1c2SAdrian Chadd 
108*0f1bf1c2SAdrian Chadd #define MBIM_UUID_CONTEXT_INTERNET {				\
109*0f1bf1c2SAdrian Chadd 		0x7e, 0x5e, 0x2a, 0x7e, 0x4e, 0x6f, 0x72, 0x72,	\
110*0f1bf1c2SAdrian Chadd 		0x73, 0x6b, 0x65, 0x6e, 0x7e, 0x5e, 0x2a, 0x7e	\
111*0f1bf1c2SAdrian Chadd 	}
112*0f1bf1c2SAdrian Chadd 
113*0f1bf1c2SAdrian Chadd #define MBIM_UUID_CONTEXT_VPN {				\
114*0f1bf1c2SAdrian Chadd 		0x9b, 0x9f, 0x7b, 0xbe, 0x89, 0x52, 0x44, 0xb7,	\
115*0f1bf1c2SAdrian Chadd 		0x83, 0xac, 0xca, 0x41, 0x31, 0x8d, 0xf7, 0xa0	\
116*0f1bf1c2SAdrian Chadd 	}
117*0f1bf1c2SAdrian Chadd 
118*0f1bf1c2SAdrian Chadd #define MBIM_UUID_QMI_MBIM {				\
119*0f1bf1c2SAdrian Chadd 		0xd1, 0xa3, 0x0b, 0xc2, 0xf9, 0x7a, 0x6e, 0x43,	\
120*0f1bf1c2SAdrian Chadd 		0xbf, 0x65, 0xc7, 0xe2, 0x4f, 0xb0, 0xf0, 0xd3	\
121*0f1bf1c2SAdrian Chadd 	}
122*0f1bf1c2SAdrian Chadd 
123*0f1bf1c2SAdrian Chadd #define MBIM_CTRLMSG_MINLEN		64
124*0f1bf1c2SAdrian Chadd #define MBIM_CTRLMSG_MAXLEN		(4 * 1204)
125*0f1bf1c2SAdrian Chadd 
126*0f1bf1c2SAdrian Chadd #define MBIM_MAXSEGSZ_MINVAL		(2 * 1024)
127*0f1bf1c2SAdrian Chadd 
128*0f1bf1c2SAdrian Chadd /*
129*0f1bf1c2SAdrian Chadd  * Control messages (host to function)
130*0f1bf1c2SAdrian Chadd  */
131*0f1bf1c2SAdrian Chadd #define MBIM_OPEN_MSG			1U
132*0f1bf1c2SAdrian Chadd #define MBIM_CLOSE_MSG			2U
133*0f1bf1c2SAdrian Chadd #define MBIM_COMMAND_MSG		3U
134*0f1bf1c2SAdrian Chadd #define MBIM_HOST_ERROR_MSG		4U
135*0f1bf1c2SAdrian Chadd 
136*0f1bf1c2SAdrian Chadd /*
137*0f1bf1c2SAdrian Chadd  * Control messages (function to host)
138*0f1bf1c2SAdrian Chadd  */
139*0f1bf1c2SAdrian Chadd #define MBIM_OPEN_DONE			0x80000001U
140*0f1bf1c2SAdrian Chadd #define MBIM_CLOSE_DONE			0x80000002U
141*0f1bf1c2SAdrian Chadd #define MBIM_COMMAND_DONE		0x80000003U
142*0f1bf1c2SAdrian Chadd #define MBIM_FUNCTION_ERROR_MSG		0x80000004U
143*0f1bf1c2SAdrian Chadd #define MBIM_INDICATE_STATUS_MSG	0x80000007U
144*0f1bf1c2SAdrian Chadd 
145*0f1bf1c2SAdrian Chadd /*
146*0f1bf1c2SAdrian Chadd  * Generic status codes
147*0f1bf1c2SAdrian Chadd  */
148*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SUCCESS			0
149*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_BUSY			1
150*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_FAILURE			2
151*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SIM_NOT_INSERTED		3
152*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_BAD_SIM			4
153*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_PIN_REQUIRED		5
154*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_PIN_DISABLED		6
155*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_NOT_REGISTERED		7
156*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_PROVIDERS_NOT_FOUND		8
157*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_NO_DEVICE_SUPPORT		9
158*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_PROVIDER_NOT_VISIBLE	10
159*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_DATA_CLASS_NOT_AVAILABLE	11
160*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_PACKET_SERVICE_DETACHED	12
161*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_MAX_ACTIVATED_CONTEXTS	13
162*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_NOT_INITIALIZED		14
163*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_VOICE_CALL_IN_PROGRESS	15
164*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_CONTEXT_NOT_ACTIVATED	16
165*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SERVICE_NOT_ACTIVATED	17
166*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_INVALID_ACCESS_STRING	18
167*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_INVALID_USER_NAME_PWD	19
168*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_RADIO_POWER_OFF		20
169*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_INVALID_PARAMETERS		21
170*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_READ_FAILURE		22
171*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_WRITE_FAILURE		23
172*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_NO_PHONEBOOK		25
173*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_PARAMETER_TOO_LONG		26
174*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_STK_BUSY			27
175*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_OPERATION_NOT_ALLOWED	28
176*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_MEMORY_FAILURE		29
177*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_INVALID_MEMORY_INDEX	30
178*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_MEMORY_FULL			31
179*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_FILTER_NOT_SUPPORTED	32
180*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_DSS_INSTANCE_LIMIT		33
181*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_INVALID_DEVICE_SERVICE_OPERATION	34
182*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_AUTH_INCORRECT_AUTN		35
183*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_AUTH_SYNC_FAILURE		36
184*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_AUTH_AMF_NOT_SET		37
185*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_CONTEXT_NOT_SUPPORTED	38
186*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SMS_UNKNOWN_SMSC_ADDRESS	100
187*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SMS_NETWORK_TIMEOUT		101
188*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SMS_LANG_NOT_SUPPORTED	102
189*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SMS_ENCODING_NOT_SUPPORTED	103
190*0f1bf1c2SAdrian Chadd #define MBIM_STATUS_SMS_FORMAT_NOT_SUPPORTED	104
191*0f1bf1c2SAdrian Chadd 
192*0f1bf1c2SAdrian Chadd /*
193*0f1bf1c2SAdrian Chadd  * Message formats
194*0f1bf1c2SAdrian Chadd  */
195*0f1bf1c2SAdrian Chadd struct mbim_msghdr {
196*0f1bf1c2SAdrian Chadd 	/* Msg header */
197*0f1bf1c2SAdrian Chadd 	uint32_t	type;		/* message type */
198*0f1bf1c2SAdrian Chadd 	uint32_t	len;		/* message length */
199*0f1bf1c2SAdrian Chadd 	uint32_t	tid;		/* transaction id */
200*0f1bf1c2SAdrian Chadd } __packed;
201*0f1bf1c2SAdrian Chadd 
202*0f1bf1c2SAdrian Chadd struct mbim_fraghdr {
203*0f1bf1c2SAdrian Chadd 	uint32_t	nfrag;		/* total # of fragments */
204*0f1bf1c2SAdrian Chadd 	uint32_t	currfrag;	/* current fragment */
205*0f1bf1c2SAdrian Chadd } __packed;
206*0f1bf1c2SAdrian Chadd 
207*0f1bf1c2SAdrian Chadd struct mbim_fragmented_msg_hdr {
208*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
209*0f1bf1c2SAdrian Chadd 	struct mbim_fraghdr	frag;
210*0f1bf1c2SAdrian Chadd } __packed;
211*0f1bf1c2SAdrian Chadd 
212*0f1bf1c2SAdrian Chadd struct mbim_h2f_openmsg {
213*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
214*0f1bf1c2SAdrian Chadd 	uint32_t		maxlen;
215*0f1bf1c2SAdrian Chadd } __packed;
216*0f1bf1c2SAdrian Chadd 
217*0f1bf1c2SAdrian Chadd struct mbim_h2f_closemsg {
218*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
219*0f1bf1c2SAdrian Chadd } __packed;
220*0f1bf1c2SAdrian Chadd 
221*0f1bf1c2SAdrian Chadd struct mbim_h2f_cmd {
222*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
223*0f1bf1c2SAdrian Chadd 	struct mbim_fraghdr	frag;
224*0f1bf1c2SAdrian Chadd 	uint8_t			devid[MBIM_UUID_LEN];
225*0f1bf1c2SAdrian Chadd 	uint32_t		cid;		/* command id */
226*0f1bf1c2SAdrian Chadd #define MBIM_CMDOP_QRY		0
227*0f1bf1c2SAdrian Chadd #define MBIM_CMDOP_SET		1
228*0f1bf1c2SAdrian Chadd 	uint32_t		op;
229*0f1bf1c2SAdrian Chadd 	uint32_t		infolen;
230*0f1bf1c2SAdrian Chadd 	uint8_t			info[];
231*0f1bf1c2SAdrian Chadd } __packed;
232*0f1bf1c2SAdrian Chadd 
233*0f1bf1c2SAdrian Chadd struct mbim_f2h_indicate_status {
234*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
235*0f1bf1c2SAdrian Chadd 	struct mbim_fraghdr	frag;
236*0f1bf1c2SAdrian Chadd 	uint8_t			devid[MBIM_UUID_LEN];
237*0f1bf1c2SAdrian Chadd 	uint32_t		cid;		/* command id */
238*0f1bf1c2SAdrian Chadd 	uint32_t		infolen;
239*0f1bf1c2SAdrian Chadd 	uint8_t			info[];
240*0f1bf1c2SAdrian Chadd } __packed;
241*0f1bf1c2SAdrian Chadd 
242*0f1bf1c2SAdrian Chadd struct mbim_f2h_hosterr {
243*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
244*0f1bf1c2SAdrian Chadd 
245*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_TIMEOUT_FRAGMENT		1
246*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE	2
247*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_LENGTH_MISMATCH		3
248*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_DUPLICATED_TID		4
249*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_NOT_OPENED			5
250*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_UNKNOWN			6
251*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_CANCEL			7
252*0f1bf1c2SAdrian Chadd #define MBIM_ERROR_MAX_TRANSFER			8
253*0f1bf1c2SAdrian Chadd 	uint32_t		err;
254*0f1bf1c2SAdrian Chadd } __packed;
255*0f1bf1c2SAdrian Chadd 
256*0f1bf1c2SAdrian Chadd struct mbim_f2h_openclosedone {
257*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
258*0f1bf1c2SAdrian Chadd 	int32_t			status;
259*0f1bf1c2SAdrian Chadd } __packed;
260*0f1bf1c2SAdrian Chadd 
261*0f1bf1c2SAdrian Chadd struct mbim_f2h_cmddone {
262*0f1bf1c2SAdrian Chadd 	struct mbim_msghdr	hdr;
263*0f1bf1c2SAdrian Chadd 	struct mbim_fraghdr	frag;
264*0f1bf1c2SAdrian Chadd 	uint8_t			devid[MBIM_UUID_LEN];
265*0f1bf1c2SAdrian Chadd 	uint32_t		cid;		/* command id */
266*0f1bf1c2SAdrian Chadd 	int32_t			status;
267*0f1bf1c2SAdrian Chadd 	uint32_t		infolen;
268*0f1bf1c2SAdrian Chadd 	uint8_t			info[];
269*0f1bf1c2SAdrian Chadd } __packed;
270*0f1bf1c2SAdrian Chadd 
271*0f1bf1c2SAdrian Chadd /*
272*0f1bf1c2SAdrian Chadd  * Messages and commands for MBIM_UUID_BASIC_CONNECT
273*0f1bf1c2SAdrian Chadd  */
274*0f1bf1c2SAdrian Chadd #define MBIM_CID_DEVICE_CAPS				1
275*0f1bf1c2SAdrian Chadd #define MBIM_CID_SUBSCRIBER_READY_STATUS		2
276*0f1bf1c2SAdrian Chadd #define MBIM_CID_RADIO_STATE				3
277*0f1bf1c2SAdrian Chadd #define MBIM_CID_PIN					4
278*0f1bf1c2SAdrian Chadd #define MBIM_CID_PIN_LIST				5
279*0f1bf1c2SAdrian Chadd #define MBIM_CID_HOME_PROVIDER				6
280*0f1bf1c2SAdrian Chadd #define MBIM_CID_PREFERRED_PROVIDERS			7
281*0f1bf1c2SAdrian Chadd #define MBIM_CID_VISIBLE_PROVIDERS			8
282*0f1bf1c2SAdrian Chadd #define MBIM_CID_REGISTER_STATE				9
283*0f1bf1c2SAdrian Chadd #define MBIM_CID_PACKET_SERVICE				10
284*0f1bf1c2SAdrian Chadd #define MBIM_CID_SIGNAL_STATE				11
285*0f1bf1c2SAdrian Chadd #define MBIM_CID_CONNECT				12
286*0f1bf1c2SAdrian Chadd #define MBIM_CID_PROVISIONED_CONTEXTS			13
287*0f1bf1c2SAdrian Chadd #define MBIM_CID_SERVICE_ACTIVATION			14
288*0f1bf1c2SAdrian Chadd #define MBIM_CID_IP_CONFIGURATION			15
289*0f1bf1c2SAdrian Chadd #define MBIM_CID_DEVICE_SERVICES			16
290*0f1bf1c2SAdrian Chadd #define MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST		19
291*0f1bf1c2SAdrian Chadd #define MBIM_CID_PACKET_STATISTICS			20
292*0f1bf1c2SAdrian Chadd #define MBIM_CID_NETWORK_IDLE_HINT			21
293*0f1bf1c2SAdrian Chadd #define MBIM_CID_EMERGENCY_MODE				22
294*0f1bf1c2SAdrian Chadd #define MBIM_CID_IP_PACKET_FILTERS			23
295*0f1bf1c2SAdrian Chadd #define MBIM_CID_MULTICARRIER_PROVIDERS			24
296*0f1bf1c2SAdrian Chadd 
297*0f1bf1c2SAdrian Chadd struct mbim_cid_subscriber_ready_info {
298*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_NOTINITIALIZED		0
299*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_INITIALIZED		1
300*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_NOTINSERTED		2
301*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_BADSIM			3
302*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_FAILURE			4
303*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_NOTACTIVATED		5
304*0f1bf1c2SAdrian Chadd #define MBIM_SIMSTATE_LOCKED			6
305*0f1bf1c2SAdrian Chadd 	uint32_t	ready;
306*0f1bf1c2SAdrian Chadd 
307*0f1bf1c2SAdrian Chadd 	uint32_t	sid_offs;
308*0f1bf1c2SAdrian Chadd 	uint32_t	sid_size;
309*0f1bf1c2SAdrian Chadd 
310*0f1bf1c2SAdrian Chadd 	uint32_t	icc_offs;
311*0f1bf1c2SAdrian Chadd 	uint32_t	icc_size;
312*0f1bf1c2SAdrian Chadd 
313*0f1bf1c2SAdrian Chadd #define MBIM_SIMUNIQEID_NONE			0
314*0f1bf1c2SAdrian Chadd #define MBIM_SIMUNIQEID_PROTECT			1
315*0f1bf1c2SAdrian Chadd 	uint32_t	info;
316*0f1bf1c2SAdrian Chadd 
317*0f1bf1c2SAdrian Chadd 	uint32_t	no_pn;
318*0f1bf1c2SAdrian Chadd 	struct {
319*0f1bf1c2SAdrian Chadd 		uint32_t	offs;
320*0f1bf1c2SAdrian Chadd 		uint32_t	size;
321*0f1bf1c2SAdrian Chadd 	}
322*0f1bf1c2SAdrian Chadd 			pn[];
323*0f1bf1c2SAdrian Chadd } __packed;
324*0f1bf1c2SAdrian Chadd 
325*0f1bf1c2SAdrian Chadd struct mbim_cid_radio_state {
326*0f1bf1c2SAdrian Chadd #define MBIM_RADIO_STATE_OFF			0
327*0f1bf1c2SAdrian Chadd #define MBIM_RADIO_STATE_ON			1
328*0f1bf1c2SAdrian Chadd 	uint32_t	state;
329*0f1bf1c2SAdrian Chadd } __packed;
330*0f1bf1c2SAdrian Chadd 
331*0f1bf1c2SAdrian Chadd struct mbim_cid_radio_state_info {
332*0f1bf1c2SAdrian Chadd 	uint32_t	hw_state;
333*0f1bf1c2SAdrian Chadd 	uint32_t	sw_state;
334*0f1bf1c2SAdrian Chadd } __packed;
335*0f1bf1c2SAdrian Chadd 
336*0f1bf1c2SAdrian Chadd struct mbim_cid_pin {
337*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_NONE			0
338*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_CUSTOM			1
339*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_PIN1			2
340*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_PIN2			3
341*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_DEV_SIM_PIN		4
342*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN		5
343*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_NETWORK_PIN		6
344*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_NETWORK_SUBSET_PIN	7
345*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN	8
346*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_CORPORATE_PIN		9
347*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_SUBSIDY_LOCK		10
348*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_PUK1			11
349*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_PUK2			12
350*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK		13
351*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_NETWORK_PUK		14
352*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_NETWORK_SUBSET_PUK	15
353*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK	16
354*0f1bf1c2SAdrian Chadd #define MBIM_PIN_TYPE_CORPORATE_PUK		17
355*0f1bf1c2SAdrian Chadd 	uint32_t	type;
356*0f1bf1c2SAdrian Chadd 
357*0f1bf1c2SAdrian Chadd #define MBIM_PIN_OP_ENTER			0
358*0f1bf1c2SAdrian Chadd #define MBIM_PIN_OP_ENABLE			1
359*0f1bf1c2SAdrian Chadd #define MBIM_PIN_OP_DISABLE			2
360*0f1bf1c2SAdrian Chadd #define MBIM_PIN_OP_CHANGE			3
361*0f1bf1c2SAdrian Chadd 	uint32_t	op;
362*0f1bf1c2SAdrian Chadd 	uint32_t	pin_offs;
363*0f1bf1c2SAdrian Chadd 	uint32_t	pin_size;
364*0f1bf1c2SAdrian Chadd 	uint32_t	newpin_offs;
365*0f1bf1c2SAdrian Chadd 	uint32_t	newpin_size;
366*0f1bf1c2SAdrian Chadd #define MBIM_PIN_MAXLEN	32
367*0f1bf1c2SAdrian Chadd 	uint8_t		data[2 * MBIM_PIN_MAXLEN];
368*0f1bf1c2SAdrian Chadd } __packed;
369*0f1bf1c2SAdrian Chadd 
370*0f1bf1c2SAdrian Chadd struct mbim_cid_pin_info {
371*0f1bf1c2SAdrian Chadd 	uint32_t	type;
372*0f1bf1c2SAdrian Chadd 
373*0f1bf1c2SAdrian Chadd #define MBIM_PIN_STATE_UNLOCKED			0
374*0f1bf1c2SAdrian Chadd #define MBIM_PIN_STATE_LOCKED			1
375*0f1bf1c2SAdrian Chadd 	uint32_t	state;
376*0f1bf1c2SAdrian Chadd 	uint32_t	remaining_attempts;
377*0f1bf1c2SAdrian Chadd } __packed;
378*0f1bf1c2SAdrian Chadd 
379*0f1bf1c2SAdrian Chadd struct mbim_cid_pin_list_info {
380*0f1bf1c2SAdrian Chadd 	struct mbim_pin_desc {
381*0f1bf1c2SAdrian Chadd 
382*0f1bf1c2SAdrian Chadd #define MBIM_PINMODE_NOTSUPPORTED		0
383*0f1bf1c2SAdrian Chadd #define MBIM_PINMODE_ENABLED			1
384*0f1bf1c2SAdrian Chadd #define MBIM_PINMODE_DISABLED			2
385*0f1bf1c2SAdrian Chadd 		uint32_t	mode;
386*0f1bf1c2SAdrian Chadd 
387*0f1bf1c2SAdrian Chadd #define MBIM_PINFORMAT_UNKNOWN			0
388*0f1bf1c2SAdrian Chadd #define MBIM_PINFORMAT_NUMERIC			1
389*0f1bf1c2SAdrian Chadd #define MBIM_PINFORMAT_ALPHANUMERIC		2
390*0f1bf1c2SAdrian Chadd 		uint32_t	format;
391*0f1bf1c2SAdrian Chadd 
392*0f1bf1c2SAdrian Chadd 		uint32_t	minlen;
393*0f1bf1c2SAdrian Chadd 		uint32_t	maxlen;
394*0f1bf1c2SAdrian Chadd 	}
395*0f1bf1c2SAdrian Chadd 		pin1,
396*0f1bf1c2SAdrian Chadd 		pin2,
397*0f1bf1c2SAdrian Chadd 		dev_sim_pin,
398*0f1bf1c2SAdrian Chadd 		first_dev_sim_pin,
399*0f1bf1c2SAdrian Chadd 		net_pin,
400*0f1bf1c2SAdrian Chadd 		net_sub_pin,
401*0f1bf1c2SAdrian Chadd 		svp_pin,
402*0f1bf1c2SAdrian Chadd 		corp_pin,
403*0f1bf1c2SAdrian Chadd 		subsidy_lock,
404*0f1bf1c2SAdrian Chadd 		custom;
405*0f1bf1c2SAdrian Chadd } __packed;
406*0f1bf1c2SAdrian Chadd 
407*0f1bf1c2SAdrian Chadd struct mbim_cid_device_caps {
408*0f1bf1c2SAdrian Chadd #define MBIM_DEVTYPE_UNKNOWN			0
409*0f1bf1c2SAdrian Chadd #define MBIM_DEVTYPE_EMBEDDED			1
410*0f1bf1c2SAdrian Chadd #define MBIM_DEVTYPE_REMOVABLE			2
411*0f1bf1c2SAdrian Chadd #define MBIM_DEVTYPE_REMOTE			3
412*0f1bf1c2SAdrian Chadd 	uint32_t	devtype;
413*0f1bf1c2SAdrian Chadd 
414*0f1bf1c2SAdrian Chadd 	uint32_t	cellclass;	/* values: MBIM_CELLULAR_CLASS */
415*0f1bf1c2SAdrian Chadd 	uint32_t	voiceclass;
416*0f1bf1c2SAdrian Chadd 	uint32_t	simclass;
417*0f1bf1c2SAdrian Chadd 	uint32_t	dataclass;	/* values: MBIM_DATA_CLASS */
418*0f1bf1c2SAdrian Chadd 	uint32_t	smscaps;
419*0f1bf1c2SAdrian Chadd 	uint32_t	cntrlcaps;
420*0f1bf1c2SAdrian Chadd 	uint32_t	max_sessions;
421*0f1bf1c2SAdrian Chadd 
422*0f1bf1c2SAdrian Chadd 	uint32_t	custdataclass_offs;
423*0f1bf1c2SAdrian Chadd 	uint32_t	custdataclass_size;
424*0f1bf1c2SAdrian Chadd 
425*0f1bf1c2SAdrian Chadd 	uint32_t	devid_offs;
426*0f1bf1c2SAdrian Chadd 	uint32_t	devid_size;
427*0f1bf1c2SAdrian Chadd 
428*0f1bf1c2SAdrian Chadd 	uint32_t	fwinfo_offs;
429*0f1bf1c2SAdrian Chadd 	uint32_t	fwinfo_size;
430*0f1bf1c2SAdrian Chadd 
431*0f1bf1c2SAdrian Chadd 	uint32_t	hwinfo_offs;
432*0f1bf1c2SAdrian Chadd 	uint32_t	hwinfo_size;
433*0f1bf1c2SAdrian Chadd 
434*0f1bf1c2SAdrian Chadd 	uint32_t	data[];
435*0f1bf1c2SAdrian Chadd } __packed;
436*0f1bf1c2SAdrian Chadd 
437*0f1bf1c2SAdrian Chadd struct mbim_cid_registration_state {
438*0f1bf1c2SAdrian Chadd 	uint32_t	provid_offs;
439*0f1bf1c2SAdrian Chadd 	uint32_t	provid_size;
440*0f1bf1c2SAdrian Chadd 
441*0f1bf1c2SAdrian Chadd #define MBIM_REGACTION_AUTOMATIC		0
442*0f1bf1c2SAdrian Chadd #define MBIM_REGACTION_MANUAL			1
443*0f1bf1c2SAdrian Chadd 	uint32_t	regaction;
444*0f1bf1c2SAdrian Chadd 	uint32_t	data_class;
445*0f1bf1c2SAdrian Chadd 
446*0f1bf1c2SAdrian Chadd 	uint32_t	data[];
447*0f1bf1c2SAdrian Chadd } __packed;
448*0f1bf1c2SAdrian Chadd 
449*0f1bf1c2SAdrian Chadd struct mbim_cid_registration_state_info {
450*0f1bf1c2SAdrian Chadd 	uint32_t	nwerror;
451*0f1bf1c2SAdrian Chadd 
452*0f1bf1c2SAdrian Chadd 	uint32_t	regstate;	/* values: MBIM_REGISTER_STATE */
453*0f1bf1c2SAdrian Chadd 
454*0f1bf1c2SAdrian Chadd #define MBIM_REGMODE_UNKNOWN			0
455*0f1bf1c2SAdrian Chadd #define MBIM_REGMODE_AUTOMATIC			1
456*0f1bf1c2SAdrian Chadd #define MBIM_REGMODE_MANUAL			2
457*0f1bf1c2SAdrian Chadd 	uint32_t	regmode;
458*0f1bf1c2SAdrian Chadd 
459*0f1bf1c2SAdrian Chadd 	uint32_t	availclasses;	/* values: MBIM_DATA_CLASS */
460*0f1bf1c2SAdrian Chadd 	uint32_t	curcellclass;	/* values: MBIM_CELLULAR_CLASS */
461*0f1bf1c2SAdrian Chadd 
462*0f1bf1c2SAdrian Chadd 	uint32_t	provid_offs;
463*0f1bf1c2SAdrian Chadd 	uint32_t	provid_size;
464*0f1bf1c2SAdrian Chadd 
465*0f1bf1c2SAdrian Chadd 	uint32_t	provname_offs;
466*0f1bf1c2SAdrian Chadd 	uint32_t	provname_size;
467*0f1bf1c2SAdrian Chadd 
468*0f1bf1c2SAdrian Chadd 	uint32_t	roamingtxt_offs;
469*0f1bf1c2SAdrian Chadd 	uint32_t	roamingtxt_size;
470*0f1bf1c2SAdrian Chadd 
471*0f1bf1c2SAdrian Chadd #define MBIM_REGFLAGS_NONE			0
472*0f1bf1c2SAdrian Chadd #define MBIM_REGFLAGS_MANUAL_NOT_AVAILABLE	1
473*0f1bf1c2SAdrian Chadd #define MBIM_REGFLAGS_PACKETSERVICE_AUTOATTACH	2
474*0f1bf1c2SAdrian Chadd 	uint32_t	regflag;
475*0f1bf1c2SAdrian Chadd 
476*0f1bf1c2SAdrian Chadd 	uint32_t	data[];
477*0f1bf1c2SAdrian Chadd } __packed;
478*0f1bf1c2SAdrian Chadd 
479*0f1bf1c2SAdrian Chadd struct mbim_cid_packet_service {
480*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_ACTION_ATTACH		0
481*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_ACTION_DETACH		1
482*0f1bf1c2SAdrian Chadd 	uint32_t	action;
483*0f1bf1c2SAdrian Chadd } __packed;
484*0f1bf1c2SAdrian Chadd 
485*0f1bf1c2SAdrian Chadd struct mbim_cid_packet_service_info {
486*0f1bf1c2SAdrian Chadd 	uint32_t	nwerror;
487*0f1bf1c2SAdrian Chadd 
488*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_STATE_UNKNOWN		0
489*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_STATE_ATTACHING		1
490*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_STATE_ATTACHED		2
491*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_STATE_DETACHING		3
492*0f1bf1c2SAdrian Chadd #define MBIM_PKTSERVICE_STATE_DETACHED		4
493*0f1bf1c2SAdrian Chadd 	uint32_t	state;
494*0f1bf1c2SAdrian Chadd 
495*0f1bf1c2SAdrian Chadd 	uint32_t	highest_dataclass;
496*0f1bf1c2SAdrian Chadd 	uint64_t	uplink_speed;
497*0f1bf1c2SAdrian Chadd 	uint64_t	downlink_speed;
498*0f1bf1c2SAdrian Chadd } __packed;
499*0f1bf1c2SAdrian Chadd 
500*0f1bf1c2SAdrian Chadd struct mbim_cid_signal_state {
501*0f1bf1c2SAdrian Chadd 	uint32_t	rssi;
502*0f1bf1c2SAdrian Chadd 	uint32_t	err_rate;
503*0f1bf1c2SAdrian Chadd 	uint32_t	ss_intvl;
504*0f1bf1c2SAdrian Chadd 	uint32_t	rssi_thr;
505*0f1bf1c2SAdrian Chadd 	uint32_t	err_thr;
506*0f1bf1c2SAdrian Chadd } __packed;
507*0f1bf1c2SAdrian Chadd 
508*0f1bf1c2SAdrian Chadd struct mbim_cid_connect {
509*0f1bf1c2SAdrian Chadd 	uint32_t	sessionid;
510*0f1bf1c2SAdrian Chadd 
511*0f1bf1c2SAdrian Chadd #define MBIM_CONNECT_DEACTIVATE		0
512*0f1bf1c2SAdrian Chadd #define MBIM_CONNECT_ACTIVATE		1
513*0f1bf1c2SAdrian Chadd 	uint32_t	command;
514*0f1bf1c2SAdrian Chadd 
515*0f1bf1c2SAdrian Chadd #define MBIM_ACCESS_MAXLEN		200
516*0f1bf1c2SAdrian Chadd 	uint32_t	access_offs;
517*0f1bf1c2SAdrian Chadd 	uint32_t	access_size;
518*0f1bf1c2SAdrian Chadd 
519*0f1bf1c2SAdrian Chadd #define MBIM_USER_MAXLEN		510
520*0f1bf1c2SAdrian Chadd 	uint32_t	user_offs;
521*0f1bf1c2SAdrian Chadd 	uint32_t	user_size;
522*0f1bf1c2SAdrian Chadd 
523*0f1bf1c2SAdrian Chadd #define MBIM_PASSWD_MAXLEN		510
524*0f1bf1c2SAdrian Chadd 	uint32_t	passwd_offs;
525*0f1bf1c2SAdrian Chadd 	uint32_t	passwd_size;
526*0f1bf1c2SAdrian Chadd 
527*0f1bf1c2SAdrian Chadd #define MBIM_COMPRESSION_NONE		0
528*0f1bf1c2SAdrian Chadd #define MBIM_COMPRESSION_ENABLE		1
529*0f1bf1c2SAdrian Chadd 	uint32_t	compression;
530*0f1bf1c2SAdrian Chadd 
531*0f1bf1c2SAdrian Chadd #define MBIM_AUTHPROT_NONE		0
532*0f1bf1c2SAdrian Chadd #define MBIM_AUTHPROT_PAP		1
533*0f1bf1c2SAdrian Chadd #define MBIM_AUTHPROT_CHAP		2
534*0f1bf1c2SAdrian Chadd #define MBIM_AUTHPROT_MSCHAP		3
535*0f1bf1c2SAdrian Chadd 	uint32_t	authprot;
536*0f1bf1c2SAdrian Chadd 
537*0f1bf1c2SAdrian Chadd #define MBIM_CONTEXT_IPTYPE_DEFAULT	0
538*0f1bf1c2SAdrian Chadd #define MBIM_CONTEXT_IPTYPE_IPV4	1
539*0f1bf1c2SAdrian Chadd #define MBIM_CONTEXT_IPTYPE_IPV6	2
540*0f1bf1c2SAdrian Chadd #define MBIM_CONTEXT_IPTYPE_IPV4V6	3
541*0f1bf1c2SAdrian Chadd #define MBIM_CONTEXT_IPTYPE_IPV4ANDV6	4
542*0f1bf1c2SAdrian Chadd 	uint32_t	iptype;
543*0f1bf1c2SAdrian Chadd 
544*0f1bf1c2SAdrian Chadd 	uint8_t		context[MBIM_UUID_LEN];
545*0f1bf1c2SAdrian Chadd 
546*0f1bf1c2SAdrian Chadd 	uint8_t		data[MBIM_ACCESS_MAXLEN + MBIM_USER_MAXLEN +
547*0f1bf1c2SAdrian Chadd 			     MBIM_PASSWD_MAXLEN];
548*0f1bf1c2SAdrian Chadd 
549*0f1bf1c2SAdrian Chadd } __packed;
550*0f1bf1c2SAdrian Chadd 
551*0f1bf1c2SAdrian Chadd struct mbim_cid_connect_info {
552*0f1bf1c2SAdrian Chadd 	uint32_t	sessionid;
553*0f1bf1c2SAdrian Chadd 
554*0f1bf1c2SAdrian Chadd #define MBIM_ACTIVATION_STATE_UNKNOWN		0
555*0f1bf1c2SAdrian Chadd #define MBIM_ACTIVATION_STATE_ACTIVATED		1
556*0f1bf1c2SAdrian Chadd #define MBIM_ACTIVATION_STATE_ACTIVATING	2
557*0f1bf1c2SAdrian Chadd #define MBIM_ACTIVATION_STATE_DEACTIVATED	3
558*0f1bf1c2SAdrian Chadd #define MBIM_ACTIVATION_STATE_DEACTIVATING	4
559*0f1bf1c2SAdrian Chadd 	uint32_t	activation;
560*0f1bf1c2SAdrian Chadd 
561*0f1bf1c2SAdrian Chadd 	uint32_t	voice;
562*0f1bf1c2SAdrian Chadd 	uint32_t	iptype;
563*0f1bf1c2SAdrian Chadd 	uint8_t		context[MBIM_UUID_LEN];
564*0f1bf1c2SAdrian Chadd 	uint32_t	nwerror;
565*0f1bf1c2SAdrian Chadd } __packed;
566*0f1bf1c2SAdrian Chadd 
567*0f1bf1c2SAdrian Chadd struct mbim_cid_ipv4_element {
568*0f1bf1c2SAdrian Chadd 	uint32_t	prefixlen;
569*0f1bf1c2SAdrian Chadd 	uint32_t	addr;
570*0f1bf1c2SAdrian Chadd } __packed;
571*0f1bf1c2SAdrian Chadd 
572*0f1bf1c2SAdrian Chadd struct mbim_cid_ipv6_element {
573*0f1bf1c2SAdrian Chadd 	uint32_t	prefixlen;
574*0f1bf1c2SAdrian Chadd 	uint8_t		addr[16];
575*0f1bf1c2SAdrian Chadd } __packed;
576*0f1bf1c2SAdrian Chadd 
577*0f1bf1c2SAdrian Chadd struct mbim_cid_ip_configuration_info {
578*0f1bf1c2SAdrian Chadd 	uint32_t	sessionid;
579*0f1bf1c2SAdrian Chadd 
580*0f1bf1c2SAdrian Chadd #define MBIM_IPCONF_HAS_ADDRINFO	0x0001
581*0f1bf1c2SAdrian Chadd #define MBIM_IPCONF_HAS_GWINFO		0x0002
582*0f1bf1c2SAdrian Chadd #define MBIM_IPCONF_HAS_DNSINFO		0x0004
583*0f1bf1c2SAdrian Chadd #define MBIM_IPCONF_HAS_MTUINFO		0x0008
584*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_available;
585*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_available;
586*0f1bf1c2SAdrian Chadd 
587*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_naddr;
588*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_addroffs;
589*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_naddr;
590*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_addroffs;
591*0f1bf1c2SAdrian Chadd 
592*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_gwoffs;
593*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_gwoffs;
594*0f1bf1c2SAdrian Chadd 
595*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_ndnssrv;
596*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_dnssrvoffs;
597*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_ndnssrv;
598*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_dnssrvoffs;
599*0f1bf1c2SAdrian Chadd 
600*0f1bf1c2SAdrian Chadd 	uint32_t	ipv4_mtu;
601*0f1bf1c2SAdrian Chadd 	uint32_t	ipv6_mtu;
602*0f1bf1c2SAdrian Chadd 
603*0f1bf1c2SAdrian Chadd 	uint32_t	data[];
604*0f1bf1c2SAdrian Chadd } __packed;
605*0f1bf1c2SAdrian Chadd 
606*0f1bf1c2SAdrian Chadd struct mbim_cid_packet_statistics_info {
607*0f1bf1c2SAdrian Chadd 	uint32_t	in_discards;
608*0f1bf1c2SAdrian Chadd 	uint32_t	in_errors;
609*0f1bf1c2SAdrian Chadd 	uint64_t	in_octets;
610*0f1bf1c2SAdrian Chadd 	uint64_t	in_packets;
611*0f1bf1c2SAdrian Chadd 	uint64_t	out_octets;
612*0f1bf1c2SAdrian Chadd 	uint64_t	out_packets;
613*0f1bf1c2SAdrian Chadd 	uint32_t	out_errors;
614*0f1bf1c2SAdrian Chadd 	uint32_t	out_discards;
615*0f1bf1c2SAdrian Chadd } __packed;
616*0f1bf1c2SAdrian Chadd 
617*0f1bf1c2SAdrian Chadd 
618*0f1bf1c2SAdrian Chadd #ifdef _KERNEL
619*0f1bf1c2SAdrian Chadd 
620*0f1bf1c2SAdrian Chadd struct mbim_descriptor {
621*0f1bf1c2SAdrian Chadd 	uByte	bLength;
622*0f1bf1c2SAdrian Chadd 	uByte	bDescriptorType;
623*0f1bf1c2SAdrian Chadd 	uByte	bDescriptorSubtype;
624*0f1bf1c2SAdrian Chadd #define MBIM_VER_MAJOR(v)	(((v) >> 8) & 0x0f)
625*0f1bf1c2SAdrian Chadd #define MBIM_VER_MINOR(v)	((v) & 0x0f)
626*0f1bf1c2SAdrian Chadd 	uWord	bcdMBIMVersion;
627*0f1bf1c2SAdrian Chadd 	uWord	wMaxControlMessage;
628*0f1bf1c2SAdrian Chadd 	uByte	bNumberFilters;
629*0f1bf1c2SAdrian Chadd 	uByte	bMaxFilterSize;
630*0f1bf1c2SAdrian Chadd 	uWord	wMaxSegmentSize;
631*0f1bf1c2SAdrian Chadd 	uByte	bmNetworkCapabilities;
632*0f1bf1c2SAdrian Chadd } __packed;
633*0f1bf1c2SAdrian Chadd 
634*0f1bf1c2SAdrian Chadd /*
635*0f1bf1c2SAdrian Chadd  * NCM Parameters
636*0f1bf1c2SAdrian Chadd  */
637*0f1bf1c2SAdrian Chadd #define NCM_GET_NTB_PARAMETERS	0x80
638*0f1bf1c2SAdrian Chadd 
639*0f1bf1c2SAdrian Chadd struct ncm_ntb_parameters {
640*0f1bf1c2SAdrian Chadd 	uWord	wLength;
641*0f1bf1c2SAdrian Chadd 	uWord	bmNtbFormatsSupported;
642*0f1bf1c2SAdrian Chadd #define NCM_FORMAT_NTB16	0x0001
643*0f1bf1c2SAdrian Chadd #define NCM_FORMAT_NTB32	0x0002
644*0f1bf1c2SAdrian Chadd 	uDWord	dwNtbInMaxSize;
645*0f1bf1c2SAdrian Chadd 	uWord	wNdpInDivisor;
646*0f1bf1c2SAdrian Chadd 	uWord	wNdpInPayloadRemainder;
647*0f1bf1c2SAdrian Chadd 	uWord	wNdpInAlignment;
648*0f1bf1c2SAdrian Chadd 	uWord	wReserved1;
649*0f1bf1c2SAdrian Chadd 	uDWord	dwNtbOutMaxSize;
650*0f1bf1c2SAdrian Chadd 	uWord	wNdpOutDivisor;
651*0f1bf1c2SAdrian Chadd 	uWord	wNdpOutPayloadRemainder;
652*0f1bf1c2SAdrian Chadd 	uWord	wNdpOutAlignment;
653*0f1bf1c2SAdrian Chadd 	uWord	wNtbOutMaxDatagrams;
654*0f1bf1c2SAdrian Chadd } __packed;
655*0f1bf1c2SAdrian Chadd 
656*0f1bf1c2SAdrian Chadd /*
657*0f1bf1c2SAdrian Chadd  * NCM Encoding
658*0f1bf1c2SAdrian Chadd  */
659*0f1bf1c2SAdrian Chadd #define MBIM_HDR16_LEN	\
660*0f1bf1c2SAdrian Chadd 	(sizeof(struct ncm_header16) + sizeof(struct ncm_pointer16))
661*0f1bf1c2SAdrian Chadd #define MBIM_HDR32_LEN	\
662*0f1bf1c2SAdrian Chadd 	(sizeof(struct ncm_header32) + sizeof(struct ncm_pointer32))
663*0f1bf1c2SAdrian Chadd 
664*0f1bf1c2SAdrian Chadd struct ncm_header16 {
665*0f1bf1c2SAdrian Chadd #define NCM_HDR16_SIG		0x484d434e
666*0f1bf1c2SAdrian Chadd 	uDWord	dwSignature;
667*0f1bf1c2SAdrian Chadd 	uWord	wHeaderLength;
668*0f1bf1c2SAdrian Chadd 	uWord	wSequence;
669*0f1bf1c2SAdrian Chadd 	uWord	wBlockLength;
670*0f1bf1c2SAdrian Chadd 	uWord	wNdpIndex;
671*0f1bf1c2SAdrian Chadd } __packed;
672*0f1bf1c2SAdrian Chadd 
673*0f1bf1c2SAdrian Chadd struct ncm_header32 {
674*0f1bf1c2SAdrian Chadd #define NCM_HDR32_SIG		0x686d636e
675*0f1bf1c2SAdrian Chadd 	uDWord	dwSignature;
676*0f1bf1c2SAdrian Chadd 	uWord	wHeaderLength;
677*0f1bf1c2SAdrian Chadd 	uWord	wSequence;
678*0f1bf1c2SAdrian Chadd 	uDWord	dwBlockLength;
679*0f1bf1c2SAdrian Chadd 	uDWord	dwNdpIndex;
680*0f1bf1c2SAdrian Chadd } __packed;
681*0f1bf1c2SAdrian Chadd 
682*0f1bf1c2SAdrian Chadd 
683*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH_SIDSHIFT	24
684*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH_GETSID(s)	(((s) > MBIM_NCM_NTH_SIDSHIFT) & 0xff)
685*0f1bf1c2SAdrian Chadd 
686*0f1bf1c2SAdrian Chadd struct ncm_pointer16_dgram {
687*0f1bf1c2SAdrian Chadd 	uWord	wDatagramIndex;
688*0f1bf1c2SAdrian Chadd 	uWord	wDatagramLen;
689*0f1bf1c2SAdrian Chadd } __packed;
690*0f1bf1c2SAdrian Chadd 
691*0f1bf1c2SAdrian Chadd struct ncm_pointer16 {
692*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH16_IPS	 0x00535049
693*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH16_ISISG(s) (((s) & 0x00ffffff) == MBIM_NCM_NTH16_IPS)
694*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH16_SIG(s)	\
695*0f1bf1c2SAdrian Chadd 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH16_IPS)
696*0f1bf1c2SAdrian Chadd 	uDWord	dwSignature;
697*0f1bf1c2SAdrian Chadd 	uWord	wLength;
698*0f1bf1c2SAdrian Chadd 	uWord	wNextNdpIndex;
699*0f1bf1c2SAdrian Chadd 
700*0f1bf1c2SAdrian Chadd 	/* Minimum is two datagrams, but can be more */
701*0f1bf1c2SAdrian Chadd 	struct ncm_pointer16_dgram dgram[2];
702*0f1bf1c2SAdrian Chadd } __packed;
703*0f1bf1c2SAdrian Chadd 
704*0f1bf1c2SAdrian Chadd struct ncm_pointer32_dgram {
705*0f1bf1c2SAdrian Chadd 	uDWord	dwDatagramIndex;
706*0f1bf1c2SAdrian Chadd 	uDWord	dwDatagramLen;
707*0f1bf1c2SAdrian Chadd } __packed;
708*0f1bf1c2SAdrian Chadd 
709*0f1bf1c2SAdrian Chadd struct ncm_pointer32 {
710*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH32_IPS	0x00737069
711*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH32_ISISG(s)	\
712*0f1bf1c2SAdrian Chadd 		(((s) & 0x00ffffff) == MBIM_NCM_NTH32_IPS)
713*0f1bf1c2SAdrian Chadd #define MBIM_NCM_NTH32_SIG(s)		\
714*0f1bf1c2SAdrian Chadd 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH32_IPS)
715*0f1bf1c2SAdrian Chadd 	uDWord	dwSignature;
716*0f1bf1c2SAdrian Chadd 	uWord	wLength;
717*0f1bf1c2SAdrian Chadd 	uWord	wReserved6;
718*0f1bf1c2SAdrian Chadd 	uDWord	dwNextNdpIndex;
719*0f1bf1c2SAdrian Chadd 	uDWord	dwReserved12;
720*0f1bf1c2SAdrian Chadd 
721*0f1bf1c2SAdrian Chadd 	/* Minimum is two datagrams, but can be more */
722*0f1bf1c2SAdrian Chadd 	struct ncm_pointer32_dgram dgram[2];
723*0f1bf1c2SAdrian Chadd } __packed;
724*0f1bf1c2SAdrian Chadd 
725*0f1bf1c2SAdrian Chadd #endif /* _KERNEL */
726*0f1bf1c2SAdrian Chadd 
727*0f1bf1c2SAdrian Chadd #endif /* _MBIM_H_ */
728