xref: /openbsd-src/sys/dev/usb/mbim.h (revision 83adad259f528e17beecae7257fe85f0f0a9dfa9)
1*83adad25Spatrick /*	$OpenBSD: mbim.h,v 1.6 2021/03/30 15:59:04 patrick Exp $ */
227131187Sgerhard 
327131187Sgerhard /*
427131187Sgerhard  * Copyright (c) 2016 genua mbH
527131187Sgerhard  * All rights reserved.
627131187Sgerhard  *
727131187Sgerhard  * Permission to use, copy, modify, and distribute this software for any
827131187Sgerhard  * purpose with or without fee is hereby granted, provided that the above
927131187Sgerhard  * copyright notice and this permission notice appear in all copies.
1027131187Sgerhard  *
1127131187Sgerhard  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1227131187Sgerhard  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1327131187Sgerhard  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1427131187Sgerhard  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1527131187Sgerhard  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1627131187Sgerhard  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1727131187Sgerhard  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1827131187Sgerhard  */
1927131187Sgerhard 
2027131187Sgerhard /*
2127131187Sgerhard  * Mobile Broadband Interface Model
222b01c74bSsthen  * https://www.usb.org/sites/default/files/MBIM-Compliance-1.0.pdf
2327131187Sgerhard  */
2427131187Sgerhard #ifndef _MBIM_H_
2527131187Sgerhard #define _MBIM_H_
2627131187Sgerhard 
2727131187Sgerhard #define UDESCSUB_MBIM			27
2827131187Sgerhard #define MBIM_INTERFACE_ALTSETTING	1
2927131187Sgerhard 
3027131187Sgerhard #define MBIM_RESET_FUNCTION		0x05
3127131187Sgerhard 
3227131187Sgerhard /*
3327131187Sgerhard  * Registration state (MBIM_REGISTER_STATE)
3427131187Sgerhard  */
3527131187Sgerhard #define MBIM_REGSTATE_UNKNOWN			0
3627131187Sgerhard #define MBIM_REGSTATE_DEREGISTERED		1
3727131187Sgerhard #define MBIM_REGSTATE_SEARCHING			2
3827131187Sgerhard #define MBIM_REGSTATE_HOME			3
3927131187Sgerhard #define MBIM_REGSTATE_ROAMING			4
4027131187Sgerhard #define MBIM_REGSTATE_PARTNER			5
4127131187Sgerhard #define MBIM_REGSTATE_DENIED			6
4227131187Sgerhard 
4327131187Sgerhard /*
4427131187Sgerhard  * Data classes mask (MBIM_DATA_CLASS)
4527131187Sgerhard  */
4627131187Sgerhard #define MBIM_DATACLASS_NONE			0x00000000
4727131187Sgerhard #define MBIM_DATACLASS_GPRS			0x00000001
4827131187Sgerhard #define MBIM_DATACLASS_EDGE			0x00000002
4927131187Sgerhard #define MBIM_DATACLASS_UMTS			0x00000004
5027131187Sgerhard #define MBIM_DATACLASS_HSDPA			0x00000008
5127131187Sgerhard #define MBIM_DATACLASS_HSUPA			0x00000010
5227131187Sgerhard #define MBIM_DATACLASS_LTE			0x00000020
5327131187Sgerhard #define MBIM_DATACLASS_1XRTT			0x00010000
5427131187Sgerhard #define MBIM_DATACLASS_1XEVDO			0x00020000
5527131187Sgerhard #define MBIM_DATACLASS_1XEVDO_REV_A		0x00040000
5627131187Sgerhard #define MBIM_DATACLASS_1XEVDV			0x00080000
5727131187Sgerhard #define MBIM_DATACLASS_3XRTT			0x00100000
5827131187Sgerhard #define MBIM_DATACLASS_1XEVDO_REV_B		0x00200000
5927131187Sgerhard #define MBIM_DATACLASS_UMB			0x00400000
6027131187Sgerhard #define MBIM_DATACLASS_CUSTOM			0x80000000
6127131187Sgerhard 
6227131187Sgerhard /*
6327131187Sgerhard  * Cell classes mask (MBIM_CELLULAR_CLASS)
6427131187Sgerhard  */
6527131187Sgerhard #define MBIM_CELLCLASS_GSM			0x00000001
6627131187Sgerhard #define MBIM_CELLCLASS_CDMA			0x00000002
6727131187Sgerhard 
6827131187Sgerhard /*
6927131187Sgerhard  * UUIDs
7027131187Sgerhard  */
7127131187Sgerhard #define MBIM_UUID_LEN		16
7227131187Sgerhard 
7327131187Sgerhard #define MBIM_UUID_BASIC_CONNECT {				\
7427131187Sgerhard 		0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f,	\
7527131187Sgerhard 		0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6, 0xdf	\
7627131187Sgerhard 	}
7727131187Sgerhard 
7827131187Sgerhard #define MBIM_UUID_CONTEXT_INTERNET {				\
7927131187Sgerhard 		0x7e, 0x5e, 0x2a, 0x7e, 0x4e, 0x6f, 0x72, 0x72,	\
8027131187Sgerhard 		0x73, 0x6b, 0x65, 0x6e, 0x7e, 0x5e, 0x2a, 0x7e	\
8127131187Sgerhard 	}
8227131187Sgerhard 
8327131187Sgerhard #define MBIM_UUID_CONTEXT_VPN {				\
8427131187Sgerhard 		0x9b, 0x9f, 0x7b, 0xbe, 0x89, 0x52, 0x44, 0xb7,	\
8527131187Sgerhard 		0x83, 0xac, 0xca, 0x41, 0x31, 0x8d, 0xf7, 0xa0	\
8627131187Sgerhard 	}
8727131187Sgerhard 
88f892d520Sgerhard #define MBIM_UUID_QMI_MBIM {				\
89f892d520Sgerhard 		0xd1, 0xa3, 0x0b, 0xc2, 0xf9, 0x7a, 0x6e, 0x43,	\
90f892d520Sgerhard 		0xbf, 0x65, 0xc7, 0xe2, 0x4f, 0xb0, 0xf0, 0xd3	\
91f892d520Sgerhard 	}
92f892d520Sgerhard 
9327131187Sgerhard #define MBIM_CTRLMSG_MINLEN		64
9427131187Sgerhard #define MBIM_CTRLMSG_MAXLEN		(4 * 1204)
9527131187Sgerhard 
9627131187Sgerhard #define MBIM_MAXSEGSZ_MINVAL		(2 * 1024)
9727131187Sgerhard 
9827131187Sgerhard /*
9927131187Sgerhard  * Control messages (host to function)
10027131187Sgerhard  */
10127131187Sgerhard #define MBIM_OPEN_MSG			1U
10227131187Sgerhard #define MBIM_CLOSE_MSG			2U
10327131187Sgerhard #define MBIM_COMMAND_MSG		3U
10427131187Sgerhard #define MBIM_HOST_ERROR_MSG		4U
10527131187Sgerhard 
10627131187Sgerhard /*
10727131187Sgerhard  * Control messages (function to host)
10827131187Sgerhard  */
10927131187Sgerhard #define MBIM_OPEN_DONE			0x80000001U
11027131187Sgerhard #define MBIM_CLOSE_DONE			0x80000002U
11127131187Sgerhard #define MBIM_COMMAND_DONE		0x80000003U
11227131187Sgerhard #define MBIM_FUNCTION_ERROR_MSG		0x80000004U
11327131187Sgerhard #define MBIM_INDICATE_STATUS_MSG	0x80000007U
11427131187Sgerhard 
11527131187Sgerhard /*
11627131187Sgerhard  * Generic status codes
11727131187Sgerhard  */
11827131187Sgerhard #define MBIM_STATUS_SUCCESS			0
11927131187Sgerhard #define MBIM_STATUS_BUSY			1
12027131187Sgerhard #define MBIM_STATUS_FAILURE			2
12127131187Sgerhard #define MBIM_STATUS_SIM_NOT_INSERTED		3
12227131187Sgerhard #define MBIM_STATUS_BAD_SIM			4
12327131187Sgerhard #define MBIM_STATUS_PIN_REQUIRED		5
12427131187Sgerhard #define MBIM_STATUS_PIN_DISABLED		6
12527131187Sgerhard #define MBIM_STATUS_NOT_REGISTERED		7
12627131187Sgerhard #define MBIM_STATUS_PROVIDERS_NOT_FOUND		8
12727131187Sgerhard #define MBIM_STATUS_NO_DEVICE_SUPPORT		9
12827131187Sgerhard #define MBIM_STATUS_PROVIDER_NOT_VISIBLE	10
12927131187Sgerhard #define MBIM_STATUS_DATA_CLASS_NOT_AVAILABLE	11
13027131187Sgerhard #define MBIM_STATUS_PACKET_SERVICE_DETACHED	12
13127131187Sgerhard #define MBIM_STATUS_MAX_ACTIVATED_CONTEXTS	13
13227131187Sgerhard #define MBIM_STATUS_NOT_INITIALIZED		14
13327131187Sgerhard #define MBIM_STATUS_VOICE_CALL_IN_PROGRESS	15
13427131187Sgerhard #define MBIM_STATUS_CONTEXT_NOT_ACTIVATED	16
13527131187Sgerhard #define MBIM_STATUS_SERVICE_NOT_ACTIVATED	17
13627131187Sgerhard #define MBIM_STATUS_INVALID_ACCESS_STRING	18
13727131187Sgerhard #define MBIM_STATUS_INVALID_USER_NAME_PWD	19
13827131187Sgerhard #define MBIM_STATUS_RADIO_POWER_OFF		20
13927131187Sgerhard #define MBIM_STATUS_INVALID_PARAMETERS		21
14027131187Sgerhard #define MBIM_STATUS_READ_FAILURE		22
14127131187Sgerhard #define MBIM_STATUS_WRITE_FAILURE		23
14227131187Sgerhard #define MBIM_STATUS_NO_PHONEBOOK		25
14327131187Sgerhard #define MBIM_STATUS_PARAMETER_TOO_LONG		26
14427131187Sgerhard #define MBIM_STATUS_STK_BUSY			27
14527131187Sgerhard #define MBIM_STATUS_OPERATION_NOT_ALLOWED	28
14627131187Sgerhard #define MBIM_STATUS_MEMORY_FAILURE		29
14727131187Sgerhard #define MBIM_STATUS_INVALID_MEMORY_INDEX	30
14827131187Sgerhard #define MBIM_STATUS_MEMORY_FULL			31
14927131187Sgerhard #define MBIM_STATUS_FILTER_NOT_SUPPORTED	32
15027131187Sgerhard #define MBIM_STATUS_DSS_INSTANCE_LIMIT		33
15127131187Sgerhard #define MBIM_STATUS_INVALID_DEVICE_SERVICE_OPERATION	34
15227131187Sgerhard #define MBIM_STATUS_AUTH_INCORRECT_AUTN		35
15327131187Sgerhard #define MBIM_STATUS_AUTH_SYNC_FAILURE		36
15427131187Sgerhard #define MBIM_STATUS_AUTH_AMF_NOT_SET		37
15527131187Sgerhard #define MBIM_STATUS_CONTEXT_NOT_SUPPORTED	38
15627131187Sgerhard #define MBIM_STATUS_SMS_UNKNOWN_SMSC_ADDRESS	100
15727131187Sgerhard #define MBIM_STATUS_SMS_NETWORK_TIMEOUT		101
15827131187Sgerhard #define MBIM_STATUS_SMS_LANG_NOT_SUPPORTED	102
15927131187Sgerhard #define MBIM_STATUS_SMS_ENCODING_NOT_SUPPORTED	103
16027131187Sgerhard #define MBIM_STATUS_SMS_FORMAT_NOT_SUPPORTED	104
16127131187Sgerhard 
16227131187Sgerhard /*
16327131187Sgerhard  * Message formats
16427131187Sgerhard  */
16527131187Sgerhard struct mbim_msghdr {
16627131187Sgerhard 	/* Msg header */
16727131187Sgerhard 	uint32_t	type;		/* message type */
16827131187Sgerhard 	uint32_t	len;		/* message length */
16927131187Sgerhard 	uint32_t	tid;		/* transaction id */
17027131187Sgerhard } __packed;
17127131187Sgerhard 
17227131187Sgerhard struct mbim_fraghdr {
17327131187Sgerhard 	uint32_t	nfrag;		/* total # of fragments */
17427131187Sgerhard 	uint32_t	currfrag;	/* current fragment */
17527131187Sgerhard } __packed;
17627131187Sgerhard 
17727131187Sgerhard struct mbim_fragmented_msg_hdr {
17827131187Sgerhard 	struct mbim_msghdr	hdr;
17927131187Sgerhard 	struct mbim_fraghdr	frag;
18027131187Sgerhard } __packed;
18127131187Sgerhard 
18227131187Sgerhard struct mbim_h2f_openmsg {
18327131187Sgerhard 	struct mbim_msghdr	hdr;
18427131187Sgerhard 	uint32_t		maxlen;
18527131187Sgerhard } __packed;
18627131187Sgerhard 
18727131187Sgerhard struct mbim_h2f_closemsg {
18827131187Sgerhard 	struct mbim_msghdr	hdr;
18927131187Sgerhard } __packed;
19027131187Sgerhard 
19127131187Sgerhard struct mbim_h2f_cmd {
19227131187Sgerhard 	struct mbim_msghdr	hdr;
19327131187Sgerhard 	struct mbim_fraghdr	frag;
19427131187Sgerhard 	uint8_t			devid[MBIM_UUID_LEN];
19527131187Sgerhard 	uint32_t		cid;		/* command id */
19627131187Sgerhard #define MBIM_CMDOP_QRY		0
19727131187Sgerhard #define MBIM_CMDOP_SET		1
19827131187Sgerhard 	uint32_t		op;
19927131187Sgerhard 	uint32_t		infolen;
20027131187Sgerhard 	uint8_t			info[];
20127131187Sgerhard } __packed;
20227131187Sgerhard 
20327131187Sgerhard struct mbim_f2h_indicate_status {
20427131187Sgerhard 	struct mbim_msghdr	hdr;
20527131187Sgerhard 	struct mbim_fraghdr	frag;
20627131187Sgerhard 	uint8_t			devid[MBIM_UUID_LEN];
20727131187Sgerhard 	uint32_t		cid;		/* command id */
20827131187Sgerhard 	uint32_t		infolen;
20927131187Sgerhard 	uint8_t			info[];
21027131187Sgerhard } __packed;
21127131187Sgerhard 
21227131187Sgerhard struct mbim_f2h_hosterr {
21327131187Sgerhard 	struct mbim_msghdr	hdr;
21427131187Sgerhard 
21527131187Sgerhard #define MBIM_ERROR_TIMEOUT_FRAGMENT		1
21627131187Sgerhard #define MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE	2
21727131187Sgerhard #define MBIM_ERROR_LENGTH_MISMATCH		3
21827131187Sgerhard #define MBIM_ERROR_DUPLICATED_TID		4
21927131187Sgerhard #define MBIM_ERROR_NOT_OPENED			5
22027131187Sgerhard #define MBIM_ERROR_UNKNOWN			6
22127131187Sgerhard #define MBIM_ERROR_CANCEL			7
22227131187Sgerhard #define MBIM_ERROR_MAX_TRANSFER			8
22327131187Sgerhard 	uint32_t		err;
22427131187Sgerhard } __packed;
22527131187Sgerhard 
22627131187Sgerhard struct mbim_f2h_openclosedone {
22727131187Sgerhard 	struct mbim_msghdr	hdr;
22827131187Sgerhard 	int32_t			status;
22927131187Sgerhard } __packed;
23027131187Sgerhard 
23127131187Sgerhard struct mbim_f2h_cmddone {
23227131187Sgerhard 	struct mbim_msghdr	hdr;
23327131187Sgerhard 	struct mbim_fraghdr	frag;
23427131187Sgerhard 	uint8_t			devid[MBIM_UUID_LEN];
23527131187Sgerhard 	uint32_t		cid;		/* command id */
23627131187Sgerhard 	int32_t			status;
23727131187Sgerhard 	uint32_t		infolen;
23827131187Sgerhard 	uint8_t			info[];
23927131187Sgerhard } __packed;
24027131187Sgerhard 
24127131187Sgerhard /*
24227131187Sgerhard  * Messages and commands for MBIM_UUID_BASIC_CONNECT
24327131187Sgerhard  */
24427131187Sgerhard #define MBIM_CID_DEVICE_CAPS				1
24527131187Sgerhard #define MBIM_CID_SUBSCRIBER_READY_STATUS		2
24627131187Sgerhard #define MBIM_CID_RADIO_STATE				3
24727131187Sgerhard #define MBIM_CID_PIN					4
24827131187Sgerhard #define MBIM_CID_PIN_LIST				5
24927131187Sgerhard #define MBIM_CID_HOME_PROVIDER				6
25027131187Sgerhard #define MBIM_CID_PREFERRED_PROVIDERS			7
25127131187Sgerhard #define MBIM_CID_VISIBLE_PROVIDERS			8
25227131187Sgerhard #define MBIM_CID_REGISTER_STATE				9
25327131187Sgerhard #define MBIM_CID_PACKET_SERVICE				10
25427131187Sgerhard #define MBIM_CID_SIGNAL_STATE				11
25527131187Sgerhard #define MBIM_CID_CONNECT				12
25627131187Sgerhard #define MBIM_CID_PROVISIONED_CONTEXTS			13
25727131187Sgerhard #define MBIM_CID_SERVICE_ACTIVATION			14
25827131187Sgerhard #define MBIM_CID_IP_CONFIGURATION			15
25927131187Sgerhard #define MBIM_CID_DEVICE_SERVICES			16
26027131187Sgerhard #define MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST		19
26127131187Sgerhard #define MBIM_CID_PACKET_STATISTICS			20
26227131187Sgerhard #define MBIM_CID_NETWORK_IDLE_HINT			21
26327131187Sgerhard #define MBIM_CID_EMERGENCY_MODE				22
26427131187Sgerhard #define MBIM_CID_IP_PACKET_FILTERS			23
26527131187Sgerhard #define MBIM_CID_MULTICARRIER_PROVIDERS			24
26627131187Sgerhard 
26727131187Sgerhard struct mbim_cid_subscriber_ready_info {
26827131187Sgerhard #define MBIM_SIMSTATE_NOTINITIALIZED		0
26927131187Sgerhard #define MBIM_SIMSTATE_INITIALIZED		1
27027131187Sgerhard #define MBIM_SIMSTATE_NOTINSERTED		2
27127131187Sgerhard #define MBIM_SIMSTATE_BADSIM			3
27227131187Sgerhard #define MBIM_SIMSTATE_FAILURE			4
27327131187Sgerhard #define MBIM_SIMSTATE_NOTACTIVATED		5
27427131187Sgerhard #define MBIM_SIMSTATE_LOCKED			6
27527131187Sgerhard 	uint32_t	ready;
27627131187Sgerhard 
27727131187Sgerhard 	uint32_t	sid_offs;
27827131187Sgerhard 	uint32_t	sid_size;
27927131187Sgerhard 
28027131187Sgerhard 	uint32_t	icc_offs;
28127131187Sgerhard 	uint32_t	icc_size;
28227131187Sgerhard 
28327131187Sgerhard #define MBIM_SIMUNIQEID_NONE			0
28427131187Sgerhard #define MBIM_SIMUNIQEID_PROTECT			1
28527131187Sgerhard 	uint32_t	info;
28627131187Sgerhard 
28727131187Sgerhard 	uint32_t	no_pn;
28827131187Sgerhard 	struct {
28927131187Sgerhard 		uint32_t	offs;
29027131187Sgerhard 		uint32_t	size;
29127131187Sgerhard 	}
29227131187Sgerhard 			pn[];
29327131187Sgerhard } __packed;
29427131187Sgerhard 
29527131187Sgerhard struct mbim_cid_radio_state {
29627131187Sgerhard #define MBIM_RADIO_STATE_OFF			0
29727131187Sgerhard #define MBIM_RADIO_STATE_ON			1
29827131187Sgerhard 	uint32_t	state;
29927131187Sgerhard } __packed;
30027131187Sgerhard 
30127131187Sgerhard struct mbim_cid_radio_state_info {
30227131187Sgerhard 	uint32_t	hw_state;
30327131187Sgerhard 	uint32_t	sw_state;
30427131187Sgerhard } __packed;
30527131187Sgerhard 
30627131187Sgerhard struct mbim_cid_pin {
30727131187Sgerhard #define MBIM_PIN_TYPE_NONE			0
30827131187Sgerhard #define MBIM_PIN_TYPE_CUSTOM			1
30927131187Sgerhard #define MBIM_PIN_TYPE_PIN1			2
31027131187Sgerhard #define MBIM_PIN_TYPE_PIN2			3
31127131187Sgerhard #define MBIM_PIN_TYPE_DEV_SIM_PIN		4
31227131187Sgerhard #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN		5
31327131187Sgerhard #define MBIM_PIN_TYPE_NETWORK_PIN		6
31427131187Sgerhard #define MBIM_PIN_TYPE_NETWORK_SUBSET_PIN	7
31527131187Sgerhard #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN	8
31627131187Sgerhard #define MBIM_PIN_TYPE_CORPORATE_PIN		9
31727131187Sgerhard #define MBIM_PIN_TYPE_SUBSIDY_LOCK		10
31827131187Sgerhard #define MBIM_PIN_TYPE_PUK1			11
31927131187Sgerhard #define MBIM_PIN_TYPE_PUK2			12
32027131187Sgerhard #define MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK		13
32127131187Sgerhard #define MBIM_PIN_TYPE_NETWORK_PUK		14
32227131187Sgerhard #define MBIM_PIN_TYPE_NETWORK_SUBSET_PUK	15
32327131187Sgerhard #define MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK	16
32427131187Sgerhard #define MBIM_PIN_TYPE_CORPORATE_PUK		17
32527131187Sgerhard 	uint32_t	type;
32627131187Sgerhard 
32727131187Sgerhard #define MBIM_PIN_OP_ENTER			0
32827131187Sgerhard #define MBIM_PIN_OP_ENABLE			1
32927131187Sgerhard #define MBIM_PIN_OP_DISABLE			2
33027131187Sgerhard #define MBIM_PIN_OP_CHANGE			3
33127131187Sgerhard 	uint32_t	op;
33227131187Sgerhard 	uint32_t	pin_offs;
33327131187Sgerhard 	uint32_t	pin_size;
33427131187Sgerhard 	uint32_t	newpin_offs;
33527131187Sgerhard 	uint32_t	newpin_size;
33627131187Sgerhard #define MBIM_PIN_MAXLEN	32
33727131187Sgerhard 	uint8_t		data[2 * MBIM_PIN_MAXLEN];
33827131187Sgerhard } __packed;
33927131187Sgerhard 
34027131187Sgerhard struct mbim_cid_pin_info {
34127131187Sgerhard 	uint32_t	type;
34227131187Sgerhard 
34327131187Sgerhard #define MBIM_PIN_STATE_UNLOCKED			0
34427131187Sgerhard #define MBIM_PIN_STATE_LOCKED			1
34527131187Sgerhard 	uint32_t	state;
34627131187Sgerhard 	uint32_t	remaining_attempts;
34727131187Sgerhard } __packed;
34827131187Sgerhard 
34927131187Sgerhard struct mbim_cid_pin_list_info {
35027131187Sgerhard 	struct mbim_pin_desc {
35127131187Sgerhard 
35227131187Sgerhard #define MBIM_PINMODE_NOTSUPPORTED		0
35327131187Sgerhard #define MBIM_PINMODE_ENABLED			1
35427131187Sgerhard #define MBIM_PINMODE_DISABLED			2
35527131187Sgerhard 		uint32_t	mode;
35627131187Sgerhard 
35727131187Sgerhard #define MBIM_PINFORMAT_UNKNOWN			0
35827131187Sgerhard #define MBIM_PINFORMAT_NUMERIC			1
35927131187Sgerhard #define MBIM_PINFORMAT_ALPHANUMERIC		2
36027131187Sgerhard 		uint32_t	format;
36127131187Sgerhard 
36227131187Sgerhard 		uint32_t	minlen;
36327131187Sgerhard 		uint32_t	maxlen;
36427131187Sgerhard 	}
36527131187Sgerhard 		pin1,
36627131187Sgerhard 		pin2,
36727131187Sgerhard 		dev_sim_pin,
36827131187Sgerhard 		first_dev_sim_pin,
36927131187Sgerhard 		net_pin,
37027131187Sgerhard 		net_sub_pin,
37127131187Sgerhard 		svp_pin,
37227131187Sgerhard 		corp_pin,
37327131187Sgerhard 		subsidy_lock,
37427131187Sgerhard 		custom;
37527131187Sgerhard } __packed;
37627131187Sgerhard 
37727131187Sgerhard struct mbim_cid_device_caps {
37827131187Sgerhard #define MBIM_DEVTYPE_UNKNOWN			0
37927131187Sgerhard #define MBIM_DEVTYPE_EMBEDDED			1
38027131187Sgerhard #define MBIM_DEVTYPE_REMOVABLE			2
38127131187Sgerhard #define MBIM_DEVTYPE_REMOTE			3
38227131187Sgerhard 	uint32_t	devtype;
38327131187Sgerhard 
38427131187Sgerhard 	uint32_t	cellclass;	/* values: MBIM_CELLULAR_CLASS */
38527131187Sgerhard 	uint32_t	voiceclass;
38627131187Sgerhard 	uint32_t	simclass;
38727131187Sgerhard 	uint32_t	dataclass;	/* values: MBIM_DATA_CLASS */
38827131187Sgerhard 	uint32_t	smscaps;
38927131187Sgerhard 	uint32_t	cntrlcaps;
39027131187Sgerhard 	uint32_t	max_sessions;
39127131187Sgerhard 
39227131187Sgerhard 	uint32_t	custdataclass_offs;
39327131187Sgerhard 	uint32_t	custdataclass_size;
39427131187Sgerhard 
39527131187Sgerhard 	uint32_t	devid_offs;
39627131187Sgerhard 	uint32_t	devid_size;
39727131187Sgerhard 
39827131187Sgerhard 	uint32_t	fwinfo_offs;
39927131187Sgerhard 	uint32_t	fwinfo_size;
40027131187Sgerhard 
40127131187Sgerhard 	uint32_t	hwinfo_offs;
40227131187Sgerhard 	uint32_t	hwinfo_size;
40327131187Sgerhard 
40427131187Sgerhard 	uint32_t	data[];
40527131187Sgerhard } __packed;
40627131187Sgerhard 
40727131187Sgerhard struct mbim_cid_registration_state {
40827131187Sgerhard 	uint32_t	provid_offs;
40927131187Sgerhard 	uint32_t	provid_size;
41027131187Sgerhard 
41127131187Sgerhard #define MBIM_REGACTION_AUTOMATIC		0
41227131187Sgerhard #define MBIM_REGACTION_MANUAL			1
41327131187Sgerhard 	uint32_t	regaction;
41427131187Sgerhard 	uint32_t	data_class;
41527131187Sgerhard 
41627131187Sgerhard 	uint32_t	data[];
41727131187Sgerhard } __packed;
41827131187Sgerhard 
41927131187Sgerhard struct mbim_cid_registration_state_info {
42027131187Sgerhard 	uint32_t	nwerror;
42127131187Sgerhard 
42227131187Sgerhard 	uint32_t	regstate;	/* values: MBIM_REGISTER_STATE */
42327131187Sgerhard 
42427131187Sgerhard #define MBIM_REGMODE_UNKNOWN			0
42527131187Sgerhard #define MBIM_REGMODE_AUTOMATIC			1
42627131187Sgerhard #define MBIM_REGMODE_MANUAL			2
42727131187Sgerhard 	uint32_t	regmode;
42827131187Sgerhard 
42927131187Sgerhard 	uint32_t	availclasses;	/* values: MBIM_DATA_CLASS */
43027131187Sgerhard 	uint32_t	curcellclass;	/* values: MBIM_CELLULAR_CLASS */
43127131187Sgerhard 
43227131187Sgerhard 	uint32_t	provid_offs;
43327131187Sgerhard 	uint32_t	provid_size;
43427131187Sgerhard 
43527131187Sgerhard 	uint32_t	provname_offs;
43627131187Sgerhard 	uint32_t	provname_size;
43727131187Sgerhard 
43827131187Sgerhard 	uint32_t	roamingtxt_offs;
43927131187Sgerhard 	uint32_t	roamingtxt_size;
44027131187Sgerhard 
44127131187Sgerhard #define MBIM_REGFLAGS_NONE			0
44227131187Sgerhard #define MBIM_REGFLAGS_MANUAL_NOT_AVAILABLE	1
44327131187Sgerhard #define MBIM_REGFLAGS_PACKETSERVICE_AUTOATTACH	2
44427131187Sgerhard 	uint32_t	regflag;
44527131187Sgerhard 
44627131187Sgerhard 	uint32_t	data[];
44727131187Sgerhard } __packed;
44827131187Sgerhard 
44927131187Sgerhard struct mbim_cid_packet_service {
45027131187Sgerhard #define MBIM_PKTSERVICE_ACTION_ATTACH		0
45127131187Sgerhard #define MBIM_PKTSERVICE_ACTION_DETACH		1
45227131187Sgerhard 	uint32_t	action;
45327131187Sgerhard } __packed;
45427131187Sgerhard 
45527131187Sgerhard struct mbim_cid_packet_service_info {
45627131187Sgerhard 	uint32_t	nwerror;
45727131187Sgerhard 
45827131187Sgerhard #define MBIM_PKTSERVICE_STATE_UNKNOWN		0
45927131187Sgerhard #define MBIM_PKTSERVICE_STATE_ATTACHING		1
46027131187Sgerhard #define MBIM_PKTSERVICE_STATE_ATTACHED		2
46127131187Sgerhard #define MBIM_PKTSERVICE_STATE_DETACHING		3
46227131187Sgerhard #define MBIM_PKTSERVICE_STATE_DETACHED		4
46327131187Sgerhard 	uint32_t	state;
46427131187Sgerhard 
46527131187Sgerhard 	uint32_t	highest_dataclass;
46627131187Sgerhard 	uint64_t	uplink_speed;
46727131187Sgerhard 	uint64_t	downlink_speed;
46827131187Sgerhard } __packed;
46927131187Sgerhard 
47027131187Sgerhard struct mbim_cid_signal_state {
47127131187Sgerhard 	uint32_t	rssi;
47227131187Sgerhard 	uint32_t	err_rate;
47327131187Sgerhard 	uint32_t	ss_intvl;
47427131187Sgerhard 	uint32_t	rssi_thr;
47527131187Sgerhard 	uint32_t	err_thr;
47627131187Sgerhard } __packed;
47727131187Sgerhard 
47827131187Sgerhard struct mbim_cid_connect {
47927131187Sgerhard 	uint32_t	sessionid;
48027131187Sgerhard 
48127131187Sgerhard #define MBIM_CONNECT_DEACTIVATE		0
48227131187Sgerhard #define MBIM_CONNECT_ACTIVATE		1
48327131187Sgerhard 	uint32_t	command;
48427131187Sgerhard 
48527131187Sgerhard #define MBIM_ACCESS_MAXLEN		200
48627131187Sgerhard 	uint32_t	access_offs;
48727131187Sgerhard 	uint32_t	access_size;
48827131187Sgerhard 
48927131187Sgerhard #define MBIM_USER_MAXLEN		510
49027131187Sgerhard 	uint32_t	user_offs;
49127131187Sgerhard 	uint32_t	user_size;
49227131187Sgerhard 
49327131187Sgerhard #define MBIM_PASSWD_MAXLEN		510
49427131187Sgerhard 	uint32_t	passwd_offs;
49527131187Sgerhard 	uint32_t	passwd_size;
49627131187Sgerhard 
49727131187Sgerhard #define MBIM_COMPRESSION_NONE		0
49827131187Sgerhard #define MBIM_COMPRESSION_ENABLE		1
49927131187Sgerhard 	uint32_t	compression;
50027131187Sgerhard 
50127131187Sgerhard #define MBIM_AUTHPROT_NONE		0
50227131187Sgerhard #define MBIM_AUTHPROT_PAP		1
50327131187Sgerhard #define MBIM_AUTHPROT_CHAP		2
50427131187Sgerhard #define MBIM_AUTHPROT_MSCHAP		3
50527131187Sgerhard 	uint32_t	authprot;
50627131187Sgerhard 
50727131187Sgerhard #define MBIM_CONTEXT_IPTYPE_DEFAULT	0
50827131187Sgerhard #define MBIM_CONTEXT_IPTYPE_IPV4	1
50927131187Sgerhard #define MBIM_CONTEXT_IPTYPE_IPV6	2
51027131187Sgerhard #define MBIM_CONTEXT_IPTYPE_IPV4V6	3
51127131187Sgerhard #define MBIM_CONTEXT_IPTYPE_IPV4ANDV6	4
51227131187Sgerhard 	uint32_t	iptype;
51327131187Sgerhard 
51427131187Sgerhard 	uint8_t		context[MBIM_UUID_LEN];
51527131187Sgerhard 
51627131187Sgerhard 	uint8_t		data[MBIM_ACCESS_MAXLEN + MBIM_USER_MAXLEN +
51727131187Sgerhard 			     MBIM_PASSWD_MAXLEN];
51827131187Sgerhard 
51927131187Sgerhard } __packed;
52027131187Sgerhard 
52127131187Sgerhard struct mbim_cid_connect_info {
52227131187Sgerhard 	uint32_t	sessionid;
52327131187Sgerhard 
52427131187Sgerhard #define MBIM_ACTIVATION_STATE_UNKNOWN		0
52527131187Sgerhard #define MBIM_ACTIVATION_STATE_ACTIVATED		1
52627131187Sgerhard #define MBIM_ACTIVATION_STATE_ACTIVATING	2
52727131187Sgerhard #define MBIM_ACTIVATION_STATE_DEACTIVATED	3
52827131187Sgerhard #define MBIM_ACTIVATION_STATE_DEACTIVATING	4
52927131187Sgerhard 	uint32_t	activation;
53027131187Sgerhard 
53127131187Sgerhard 	uint32_t	voice;
53227131187Sgerhard 	uint32_t	iptype;
53327131187Sgerhard 	uint8_t		context[MBIM_UUID_LEN];
53427131187Sgerhard 	uint32_t	nwerror;
53527131187Sgerhard } __packed;
53627131187Sgerhard 
53727131187Sgerhard struct mbim_cid_ipv4_element {
53827131187Sgerhard 	uint32_t	prefixlen;
53927131187Sgerhard 	uint32_t	addr;
54027131187Sgerhard } __packed;
54127131187Sgerhard 
54227131187Sgerhard struct mbim_cid_ipv6_element {
54327131187Sgerhard 	uint32_t	prefixlen;
54427131187Sgerhard 	uint8_t		addr[16];
54527131187Sgerhard } __packed;
54627131187Sgerhard 
54727131187Sgerhard struct mbim_cid_ip_configuration_info {
54827131187Sgerhard 	uint32_t	sessionid;
54927131187Sgerhard 
55027131187Sgerhard #define MBIM_IPCONF_HAS_ADDRINFO	0x0001
55127131187Sgerhard #define MBIM_IPCONF_HAS_GWINFO		0x0002
55227131187Sgerhard #define MBIM_IPCONF_HAS_DNSINFO		0x0004
55327131187Sgerhard #define MBIM_IPCONF_HAS_MTUINFO		0x0008
55427131187Sgerhard 	uint32_t	ipv4_available;
55527131187Sgerhard 	uint32_t	ipv6_available;
55627131187Sgerhard 
55727131187Sgerhard 	uint32_t	ipv4_naddr;
55827131187Sgerhard 	uint32_t	ipv4_addroffs;
55927131187Sgerhard 	uint32_t	ipv6_naddr;
56027131187Sgerhard 	uint32_t	ipv6_addroffs;
56127131187Sgerhard 
56227131187Sgerhard 	uint32_t	ipv4_gwoffs;
56327131187Sgerhard 	uint32_t	ipv6_gwoffs;
56427131187Sgerhard 
56527131187Sgerhard 	uint32_t	ipv4_ndnssrv;
56627131187Sgerhard 	uint32_t	ipv4_dnssrvoffs;
56727131187Sgerhard 	uint32_t	ipv6_ndnssrv;
56827131187Sgerhard 	uint32_t	ipv6_dnssrvoffs;
56927131187Sgerhard 
57027131187Sgerhard 	uint32_t	ipv4_mtu;
57127131187Sgerhard 	uint32_t	ipv6_mtu;
57227131187Sgerhard 
57327131187Sgerhard 	uint32_t	data[];
57427131187Sgerhard } __packed;
57527131187Sgerhard 
57627131187Sgerhard struct mbim_cid_packet_statistics_info {
57727131187Sgerhard 	uint32_t	in_discards;
57827131187Sgerhard 	uint32_t	in_errors;
57927131187Sgerhard 	uint64_t	in_octets;
58027131187Sgerhard 	uint64_t	in_packets;
58127131187Sgerhard 	uint64_t	out_octets;
58227131187Sgerhard 	uint64_t	out_packets;
58327131187Sgerhard 	uint32_t	out_errors;
58427131187Sgerhard 	uint32_t	out_discards;
58527131187Sgerhard } __packed;
58627131187Sgerhard 
58727131187Sgerhard 
58827131187Sgerhard #ifdef _KERNEL
58927131187Sgerhard 
59027131187Sgerhard struct mbim_descriptor {
59127131187Sgerhard 	uByte	bLength;
59227131187Sgerhard 	uByte	bDescriptorType;
59327131187Sgerhard 	uByte	bDescriptorSubtype;
59427131187Sgerhard #define MBIM_VER_MAJOR(v)	(((v) >> 8) & 0x0f)
59527131187Sgerhard #define MBIM_VER_MINOR(v)	((v) & 0x0f)
59627131187Sgerhard 	uWord	bcdMBIMVersion;
59727131187Sgerhard 	uWord	wMaxControlMessage;
59827131187Sgerhard 	uByte	bNumberFilters;
59927131187Sgerhard 	uByte	bMaxFilterSize;
60027131187Sgerhard 	uWord	wMaxSegmentSize;
60127131187Sgerhard 	uByte	bmNetworkCapabilities;
60227131187Sgerhard } __packed;
60327131187Sgerhard 
60427131187Sgerhard /*
6051bfc9b14Sgerhard  * NCM Parameters
6061bfc9b14Sgerhard  */
6071bfc9b14Sgerhard #define NCM_GET_NTB_PARAMETERS	0x80
608*83adad25Spatrick #define NCM_GET_NTB_FORMAT	0x83	/* Current format returned as uWord */
609*83adad25Spatrick #define NCM_SET_NTB_FORMAT	0x84	/* Desired format is in wValue */
610*83adad25Spatrick 
611*83adad25Spatrick #define NCM_FORMAT_NTB16	0x00
612*83adad25Spatrick #define NCM_FORMAT_NTB32	0x01
6131bfc9b14Sgerhard 
6141bfc9b14Sgerhard struct ncm_ntb_parameters {
6151bfc9b14Sgerhard 	uWord	wLength;
6161bfc9b14Sgerhard 	uWord	bmNtbFormatsSupported;
617*83adad25Spatrick #define NCM_FORMAT_NTB16_MASK	(1U << NCM_FORMAT_NTB16)
618*83adad25Spatrick #define NCM_FORMAT_NTB32_MASK	(1U << NCM_FORMAT_NTB32)
6191bfc9b14Sgerhard 	uDWord	dwNtbInMaxSize;
620ccb704bcSgerhard 	uWord	wNdpInDivisor;
621ccb704bcSgerhard 	uWord	wNdpInPayloadRemainder;
622ccb704bcSgerhard 	uWord	wNdpInAlignment;
6231bfc9b14Sgerhard 	uWord	wReserved1;
6241bfc9b14Sgerhard 	uDWord	dwNtbOutMaxSize;
625ccb704bcSgerhard 	uWord	wNdpOutDivisor;
626ccb704bcSgerhard 	uWord	wNdpOutPayloadRemainder;
627ccb704bcSgerhard 	uWord	wNdpOutAlignment;
6281bfc9b14Sgerhard 	uWord	wNtbOutMaxDatagrams;
6291bfc9b14Sgerhard } __packed;
6301bfc9b14Sgerhard 
6311bfc9b14Sgerhard /*
63227131187Sgerhard  * NCM Encoding
63327131187Sgerhard  */
63427131187Sgerhard struct ncm_header16 {
63527131187Sgerhard #define NCM_HDR16_SIG		0x484d434e
63627131187Sgerhard 	uDWord	dwSignature;
63727131187Sgerhard 	uWord	wHeaderLength;
63827131187Sgerhard 	uWord	wSequence;
63927131187Sgerhard 	uWord	wBlockLength;
64027131187Sgerhard 	uWord	wNdpIndex;
64127131187Sgerhard } __packed;
64227131187Sgerhard 
64327131187Sgerhard struct ncm_header32 {
64427131187Sgerhard #define NCM_HDR32_SIG		0x686d636e
64527131187Sgerhard 	uDWord	dwSignature;
64627131187Sgerhard 	uWord	wHeaderLength;
64727131187Sgerhard 	uWord	wSequence;
64827131187Sgerhard 	uDWord	dwBlockLength;
64927131187Sgerhard 	uDWord	dwNdpIndex;
65027131187Sgerhard } __packed;
65127131187Sgerhard 
65227131187Sgerhard 
65327131187Sgerhard #define MBIM_NCM_NTH_SIDSHIFT	24
65427131187Sgerhard #define MBIM_NCM_NTH_GETSID(s)	(((s) > MBIM_NCM_NTH_SIDSHIFT) & 0xff)
65527131187Sgerhard 
65627131187Sgerhard struct ncm_pointer16_dgram {
65727131187Sgerhard 	uWord	wDatagramIndex;
65827131187Sgerhard 	uWord	wDatagramLen;
65927131187Sgerhard } __packed;
66027131187Sgerhard 
66127131187Sgerhard struct ncm_pointer16 {
66227131187Sgerhard #define MBIM_NCM_NTH16_IPS	 0x00535049
66327131187Sgerhard #define MBIM_NCM_NTH16_ISISG(s) (((s) & 0x00ffffff) == MBIM_NCM_NTH16_IPS)
66427131187Sgerhard #define MBIM_NCM_NTH16_SIG(s)	\
66527131187Sgerhard 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH16_IPS)
66627131187Sgerhard 	uDWord	dwSignature;
66727131187Sgerhard 	uWord	wLength;
66827131187Sgerhard 	uWord	wNextNdpIndex;
66927131187Sgerhard 
67027131187Sgerhard 	/* Minimum is two datagrams, but can be more */
671ccb704bcSgerhard 	struct ncm_pointer16_dgram dgram[1];
67227131187Sgerhard } __packed;
67327131187Sgerhard 
67427131187Sgerhard struct ncm_pointer32_dgram {
67527131187Sgerhard 	uDWord	dwDatagramIndex;
67627131187Sgerhard 	uDWord	dwDatagramLen;
67727131187Sgerhard } __packed;
67827131187Sgerhard 
67927131187Sgerhard struct ncm_pointer32 {
68027131187Sgerhard #define MBIM_NCM_NTH32_IPS	0x00737069
68127131187Sgerhard #define MBIM_NCM_NTH32_ISISG(s)	\
68227131187Sgerhard 		(((s) & 0x00ffffff) == MBIM_NCM_NTH32_IPS)
68327131187Sgerhard #define MBIM_NCM_NTH32_SIG(s)		\
68427131187Sgerhard 		((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH32_IPS)
68527131187Sgerhard 	uDWord	dwSignature;
68627131187Sgerhard 	uWord	wLength;
68727131187Sgerhard 	uWord	wReserved6;
68827131187Sgerhard 	uDWord	dwNextNdpIndex;
68927131187Sgerhard 	uDWord	dwReserved12;
69027131187Sgerhard 
69127131187Sgerhard 	/* Minimum is two datagrams, but can be more */
692ccb704bcSgerhard 	struct ncm_pointer32_dgram dgram[1];
69327131187Sgerhard } __packed;
69427131187Sgerhard 
69527131187Sgerhard #endif /* _KERNEL */
69627131187Sgerhard 
69727131187Sgerhard #endif /* _MBIM_H_ */
698