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