xref: /openbsd-src/sys/dev/usb/if_umb.h (revision 16cce00f95c57e1143e0e245e7277ba32aff2396)
1*16cce00fSdlg /*	$OpenBSD: if_umb.h,v 1.11 2023/08/29 23:26:40 dlg 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 
2527131187Sgerhard struct umb_valdescr {
2627131187Sgerhard 	int	 val;
2727131187Sgerhard 	char	*descr;
2827131187Sgerhard };
2927131187Sgerhard 
3027131187Sgerhard static const char *
umb_val2descr(const struct umb_valdescr * vdp,int val)3127131187Sgerhard umb_val2descr(const struct umb_valdescr *vdp, int val)
3227131187Sgerhard {
3327131187Sgerhard 	static char sval[32];
3427131187Sgerhard 
3527131187Sgerhard 	while (vdp->descr != NULL) {
3627131187Sgerhard 		if (vdp->val == val)
3727131187Sgerhard 			return vdp->descr;
3827131187Sgerhard 		vdp++;
3927131187Sgerhard 	}
4027131187Sgerhard 	snprintf(sval, sizeof (sval), "#%d", val);
4127131187Sgerhard 	return sval;
4227131187Sgerhard }
4327131187Sgerhard 
4427131187Sgerhard #define MBIM_REGSTATE_DESCRIPTIONS {				\
4527131187Sgerhard 	{ MBIM_REGSTATE_UNKNOWN,	"unknown" },		\
4627131187Sgerhard 	{ MBIM_REGSTATE_DEREGISTERED,	"not registered" },	\
4727131187Sgerhard 	{ MBIM_REGSTATE_SEARCHING,	"searching" },		\
4827131187Sgerhard 	{ MBIM_REGSTATE_HOME,		"home network" },	\
4927131187Sgerhard 	{ MBIM_REGSTATE_ROAMING,	"roaming network" },	\
5027131187Sgerhard 	{ MBIM_REGSTATE_PARTNER,	"partner network" },	\
5127131187Sgerhard 	{ MBIM_REGSTATE_DENIED,		"access denied" },	\
5227131187Sgerhard 	{ 0, NULL } }
5327131187Sgerhard 
5427131187Sgerhard #define MBIM_DATACLASS_DESCRIPTIONS {					\
5527131187Sgerhard 	{ MBIM_DATACLASS_NONE,				"none" },	\
5627131187Sgerhard 	{ MBIM_DATACLASS_GPRS,				"GPRS" },	\
5727131187Sgerhard 	{ MBIM_DATACLASS_EDGE,				"EDGE" },	\
5827131187Sgerhard 	{ MBIM_DATACLASS_UMTS,				"UMTS" },	\
5927131187Sgerhard 	{ MBIM_DATACLASS_HSDPA,				"HSDPA" },	\
6027131187Sgerhard 	{ MBIM_DATACLASS_HSUPA,				"HSUPA" },	\
6127131187Sgerhard 	{ MBIM_DATACLASS_HSDPA|MBIM_DATACLASS_HSUPA,	"HSPA" },	\
6227131187Sgerhard 	{ MBIM_DATACLASS_LTE,				"LTE" },	\
6327131187Sgerhard 	{ MBIM_DATACLASS_1XRTT,				"CDMA2000" },	\
6427131187Sgerhard 	{ MBIM_DATACLASS_1XEVDO,			"CDMA2000" },	\
6527131187Sgerhard 	{ MBIM_DATACLASS_1XEVDO_REV_A,			"CDMA2000" },	\
6627131187Sgerhard 	{ MBIM_DATACLASS_1XEVDV,			"CDMA2000" },	\
6727131187Sgerhard 	{ MBIM_DATACLASS_3XRTT,				"CDMA2000" },	\
6827131187Sgerhard 	{ MBIM_DATACLASS_1XEVDO_REV_B,			"CDMA2000" },	\
6927131187Sgerhard 	{ MBIM_DATACLASS_UMB,				"CDMA2000" },	\
7027131187Sgerhard 	{ MBIM_DATACLASS_CUSTOM,			"custom" },	\
7127131187Sgerhard 	{ 0, NULL } }
7227131187Sgerhard 
7327131187Sgerhard #define MBIM_1TO1_DESCRIPTION(m)	{ (m), #m }
7427131187Sgerhard #define MBIM_MESSAGES_DESCRIPTIONS {				\
7527131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_MSG),			\
7627131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_MSG),			\
7727131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_MSG),		\
7827131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_HOST_ERROR_MSG),		\
7927131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_DONE),			\
8027131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_DONE),			\
8127131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_DONE),		\
8227131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_FUNCTION_ERROR_MSG),		\
8327131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_INDICATE_STATUS_MSG),	\
8427131187Sgerhard 	{ 0, NULL } }
8527131187Sgerhard 
8627131187Sgerhard #define MBIM_STATUS_DESCRIPTION(m)	{ MBIM_STATUS_ ## m, #m }
8727131187Sgerhard #define MBIM_STATUS_DESCRIPTIONS {					\
8827131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SUCCESS),				\
8927131187Sgerhard 	MBIM_STATUS_DESCRIPTION(BUSY),					\
9027131187Sgerhard 	MBIM_STATUS_DESCRIPTION(FAILURE),				\
9127131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SIM_NOT_INSERTED),			\
9227131187Sgerhard 	MBIM_STATUS_DESCRIPTION(BAD_SIM),				\
9327131187Sgerhard 	MBIM_STATUS_DESCRIPTION(PIN_REQUIRED),				\
9427131187Sgerhard 	MBIM_STATUS_DESCRIPTION(PIN_DISABLED),				\
9527131187Sgerhard 	MBIM_STATUS_DESCRIPTION(NOT_REGISTERED),			\
9627131187Sgerhard 	MBIM_STATUS_DESCRIPTION(PROVIDERS_NOT_FOUND),			\
9727131187Sgerhard 	MBIM_STATUS_DESCRIPTION(NO_DEVICE_SUPPORT),			\
9827131187Sgerhard 	MBIM_STATUS_DESCRIPTION(PROVIDER_NOT_VISIBLE),			\
9927131187Sgerhard 	MBIM_STATUS_DESCRIPTION(DATA_CLASS_NOT_AVAILABLE),		\
10027131187Sgerhard 	MBIM_STATUS_DESCRIPTION(PACKET_SERVICE_DETACHED),		\
10127131187Sgerhard 	MBIM_STATUS_DESCRIPTION(MAX_ACTIVATED_CONTEXTS),		\
10227131187Sgerhard 	MBIM_STATUS_DESCRIPTION(NOT_INITIALIZED),			\
10327131187Sgerhard 	MBIM_STATUS_DESCRIPTION(VOICE_CALL_IN_PROGRESS),		\
10427131187Sgerhard 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_ACTIVATED),			\
10527131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SERVICE_NOT_ACTIVATED),			\
10627131187Sgerhard 	MBIM_STATUS_DESCRIPTION(INVALID_ACCESS_STRING),			\
10727131187Sgerhard 	MBIM_STATUS_DESCRIPTION(INVALID_USER_NAME_PWD),			\
10827131187Sgerhard 	MBIM_STATUS_DESCRIPTION(RADIO_POWER_OFF),			\
10927131187Sgerhard 	MBIM_STATUS_DESCRIPTION(INVALID_PARAMETERS),			\
11027131187Sgerhard 	MBIM_STATUS_DESCRIPTION(READ_FAILURE),				\
11127131187Sgerhard 	MBIM_STATUS_DESCRIPTION(WRITE_FAILURE),				\
11227131187Sgerhard 	MBIM_STATUS_DESCRIPTION(NO_PHONEBOOK),				\
11327131187Sgerhard 	MBIM_STATUS_DESCRIPTION(PARAMETER_TOO_LONG),			\
11427131187Sgerhard 	MBIM_STATUS_DESCRIPTION(STK_BUSY),				\
11527131187Sgerhard 	MBIM_STATUS_DESCRIPTION(OPERATION_NOT_ALLOWED),			\
11627131187Sgerhard 	MBIM_STATUS_DESCRIPTION(MEMORY_FAILURE),			\
11727131187Sgerhard 	MBIM_STATUS_DESCRIPTION(INVALID_MEMORY_INDEX),			\
11827131187Sgerhard 	MBIM_STATUS_DESCRIPTION(MEMORY_FULL),				\
11927131187Sgerhard 	MBIM_STATUS_DESCRIPTION(FILTER_NOT_SUPPORTED),			\
12027131187Sgerhard 	MBIM_STATUS_DESCRIPTION(DSS_INSTANCE_LIMIT),			\
12127131187Sgerhard 	MBIM_STATUS_DESCRIPTION(INVALID_DEVICE_SERVICE_OPERATION),	\
12227131187Sgerhard 	MBIM_STATUS_DESCRIPTION(AUTH_INCORRECT_AUTN),			\
12327131187Sgerhard 	MBIM_STATUS_DESCRIPTION(AUTH_SYNC_FAILURE),			\
12427131187Sgerhard 	MBIM_STATUS_DESCRIPTION(AUTH_AMF_NOT_SET),			\
12527131187Sgerhard 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_SUPPORTED),			\
12627131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SMS_UNKNOWN_SMSC_ADDRESS),		\
12727131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SMS_NETWORK_TIMEOUT),			\
12827131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SMS_LANG_NOT_SUPPORTED),		\
12927131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SMS_ENCODING_NOT_SUPPORTED),		\
13027131187Sgerhard 	MBIM_STATUS_DESCRIPTION(SMS_FORMAT_NOT_SUPPORTED),		\
13127131187Sgerhard 	{ 0, NULL } }
13227131187Sgerhard 
13327131187Sgerhard #define MBIM_ERROR_DESCRIPTION(m)	{ MBIM_ERROR_ ## m, #m }
13427131187Sgerhard #define MBIM_ERROR_DESCRIPTIONS {					\
13527131187Sgerhard 	MBIM_ERROR_DESCRIPTION(TIMEOUT_FRAGMENT),			\
13627131187Sgerhard 	MBIM_ERROR_DESCRIPTION(FRAGMENT_OUT_OF_SEQUENCE),		\
13727131187Sgerhard 	MBIM_ERROR_DESCRIPTION(LENGTH_MISMATCH),			\
13827131187Sgerhard 	MBIM_ERROR_DESCRIPTION(DUPLICATED_TID),				\
13927131187Sgerhard 	MBIM_ERROR_DESCRIPTION(NOT_OPENED),				\
14027131187Sgerhard 	MBIM_ERROR_DESCRIPTION(UNKNOWN),				\
14127131187Sgerhard 	MBIM_ERROR_DESCRIPTION(CANCEL),					\
14227131187Sgerhard 	MBIM_ERROR_DESCRIPTION(MAX_TRANSFER),				\
14327131187Sgerhard 	{ 0, NULL } }
14427131187Sgerhard 
14527131187Sgerhard #define MBIM_CID_DESCRIPTIONS {						\
14627131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_CAPS),			\
14727131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SUBSCRIBER_READY_STATUS),	\
14827131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_RADIO_STATE),			\
14927131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN),				\
15027131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN_LIST),			\
15127131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_HOME_PROVIDER),			\
15227131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PREFERRED_PROVIDERS),		\
15327131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_VISIBLE_PROVIDERS),		\
15427131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_REGISTER_STATE),			\
15527131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_SERVICE),			\
15627131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SIGNAL_STATE),			\
15727131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_CONNECT),			\
15827131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PROVISIONED_CONTEXTS),		\
15927131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SERVICE_ACTIVATION),		\
16027131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_CONFIGURATION),		\
16127131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICES),		\
16227131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST),	\
16327131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_STATISTICS),		\
16427131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_NETWORK_IDLE_HINT),		\
16527131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_EMERGENCY_MODE),			\
16627131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_PACKET_FILTERS),		\
16727131187Sgerhard 	MBIM_1TO1_DESCRIPTION(MBIM_CID_MULTICARRIER_PROVIDERS),		\
16827131187Sgerhard 	{ 0, NULL } }
16927131187Sgerhard 
17027131187Sgerhard #define MBIM_SIMSTATE_DESCRIPTIONS {					\
17127131187Sgerhard 	{ MBIM_SIMSTATE_NOTINITIALIZED, "not initialized" },		\
17227131187Sgerhard 	{ MBIM_SIMSTATE_INITIALIZED, "initialized" },			\
17327131187Sgerhard 	{ MBIM_SIMSTATE_NOTINSERTED, "not inserted" },			\
17427131187Sgerhard 	{ MBIM_SIMSTATE_BADSIM, "bad type" },				\
17527131187Sgerhard 	{ MBIM_SIMSTATE_FAILURE, "failed" },				\
17627131187Sgerhard 	{ MBIM_SIMSTATE_NOTACTIVATED, "not activated" },		\
17727131187Sgerhard 	{ MBIM_SIMSTATE_LOCKED, "locked" },				\
17827131187Sgerhard 	{ 0, NULL } }
17927131187Sgerhard 
18027131187Sgerhard #define MBIM_PINTYPE_DESCRIPTIONS {					\
18127131187Sgerhard 	{ MBIM_PIN_TYPE_NONE, "none" },					\
18227131187Sgerhard 	{ MBIM_PIN_TYPE_CUSTOM, "custom" },				\
18327131187Sgerhard 	{ MBIM_PIN_TYPE_PIN1, "PIN1" },					\
18427131187Sgerhard 	{ MBIM_PIN_TYPE_PIN2, "PIN2" },					\
18527131187Sgerhard 	{ MBIM_PIN_TYPE_DEV_SIM_PIN, "device PIN" },			\
18627131187Sgerhard 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN, "device 1st PIN" },		\
18727131187Sgerhard 	{ MBIM_PIN_TYPE_NETWORK_PIN, "network PIN" },			\
18827131187Sgerhard 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PIN, "network subset PIN" },	\
18927131187Sgerhard 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN, "provider PIN" },		\
19027131187Sgerhard 	{ MBIM_PIN_TYPE_CORPORATE_PIN, "corporate PIN" },		\
19127131187Sgerhard 	{ MBIM_PIN_TYPE_SUBSIDY_LOCK, "subsidy lock" },			\
19227131187Sgerhard 	{ MBIM_PIN_TYPE_PUK1, "PUK" },					\
19327131187Sgerhard 	{ MBIM_PIN_TYPE_PUK2, "PUK2" },					\
19427131187Sgerhard 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK, "device 1st PUK" },		\
19527131187Sgerhard 	{ MBIM_PIN_TYPE_NETWORK_PUK, "network PUK" },			\
19627131187Sgerhard 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PUK, "network subset PUK" },	\
19727131187Sgerhard 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK, "provider PUK" },		\
19827131187Sgerhard 	{ MBIM_PIN_TYPE_CORPORATE_PUK, "corporate PUK" },		\
19927131187Sgerhard 	{ 0, NULL } }
20027131187Sgerhard 
20127131187Sgerhard #define MBIM_PKTSRV_STATE_DESCRIPTIONS {				\
20227131187Sgerhard 	{ MBIM_PKTSERVICE_STATE_UNKNOWN, "unknown" },			\
20327131187Sgerhard 	{ MBIM_PKTSERVICE_STATE_ATTACHING, "attaching" },		\
20427131187Sgerhard 	{ MBIM_PKTSERVICE_STATE_ATTACHED, "attached" },			\
20527131187Sgerhard 	{ MBIM_PKTSERVICE_STATE_DETACHING, "detaching" },		\
20627131187Sgerhard 	{ MBIM_PKTSERVICE_STATE_DETACHED, "detached" },			\
20727131187Sgerhard 	{ 0, NULL } }
20827131187Sgerhard 
20927131187Sgerhard #define MBIM_ACTIVATION_STATE_DESCRIPTIONS {				\
21027131187Sgerhard 	{ MBIM_ACTIVATION_STATE_UNKNOWN, "unknown" },			\
21127131187Sgerhard 	{ MBIM_ACTIVATION_STATE_ACTIVATED, "activated" },		\
21227131187Sgerhard 	{ MBIM_ACTIVATION_STATE_ACTIVATING, "activating" },		\
21327131187Sgerhard 	{ MBIM_ACTIVATION_STATE_DEACTIVATED, "deactivated" },		\
21427131187Sgerhard 	{ MBIM_ACTIVATION_STATE_DEACTIVATING, "deactivating" },		\
21527131187Sgerhard 	{ 0, NULL } }
21627131187Sgerhard 
21727131187Sgerhard /*
21827131187Sgerhard  * Driver internal state
21927131187Sgerhard  */
22027131187Sgerhard enum umb_state {
22127131187Sgerhard 	UMB_S_DOWN = 0,		/* interface down */
22227131187Sgerhard 	UMB_S_OPEN,		/* MBIM device has been opened */
223f892d520Sgerhard 	UMB_S_CID,		/* QMI client id allocated */
22427131187Sgerhard 	UMB_S_RADIO,		/* radio is on */
22527131187Sgerhard 	UMB_S_SIMREADY,		/* SIM is ready */
22627131187Sgerhard 	UMB_S_ATTACHED,		/* packet service is attached */
22727131187Sgerhard 	UMB_S_CONNECTED,	/* connected to provider */
22827131187Sgerhard 	UMB_S_UP,		/* have IP configuration */
22927131187Sgerhard };
23027131187Sgerhard 
23127131187Sgerhard #define UMB_INTERNAL_STATE_DESCRIPTIONS {	\
23227131187Sgerhard 	{ UMB_S_DOWN, "down" },			\
23327131187Sgerhard 	{ UMB_S_OPEN, "open" },			\
234f892d520Sgerhard 	{ UMB_S_CID, "CID allocated" },		\
23527131187Sgerhard 	{ UMB_S_RADIO, "radio on" },		\
23627131187Sgerhard 	{ UMB_S_SIMREADY, "SIM is ready" },	\
23727131187Sgerhard 	{ UMB_S_ATTACHED, "attached" },		\
23827131187Sgerhard 	{ UMB_S_CONNECTED, "connected" },	\
23927131187Sgerhard 	{ UMB_S_UP, "up" },			\
24027131187Sgerhard 	{ 0, NULL } }
24127131187Sgerhard 
24227131187Sgerhard /*
24327131187Sgerhard  * UMB parameters (SIOC[GS]UMBPARAM ioctls)
24427131187Sgerhard  */
24527131187Sgerhard struct umb_parameter {
24627131187Sgerhard 	int			op;
24727131187Sgerhard 	int			is_puk;
24827131187Sgerhard 	char			pin[MBIM_PIN_MAXLEN];
24927131187Sgerhard 	int			pinlen;
25027131187Sgerhard 
25127131187Sgerhard 	char			newpin[MBIM_PIN_MAXLEN];
25227131187Sgerhard 	int			newpinlen;
25327131187Sgerhard 
25427131187Sgerhard #define UMB_APN_MAXLEN		100
25527131187Sgerhard 	uint16_t		apn[UMB_APN_MAXLEN];
25627131187Sgerhard 	int			apnlen;
25727131187Sgerhard 
25827131187Sgerhard 	int			roaming;
25927131187Sgerhard 	uint32_t		preferredclasses;
26027131187Sgerhard };
26127131187Sgerhard 
26227131187Sgerhard /*
26327131187Sgerhard  * UMB device status info (SIOCGUMBINFO ioctl)
26427131187Sgerhard  */
26527131187Sgerhard struct umb_info {
26627131187Sgerhard 	enum umb_state		state;
26727131187Sgerhard 	int			enable_roaming;
26827131187Sgerhard #define UMB_PIN_REQUIRED	0
26927131187Sgerhard #define UMB_PIN_UNLOCKED	1
27027131187Sgerhard #define UMB_PUK_REQUIRED	2
27127131187Sgerhard 	int			pin_state;
27227131187Sgerhard 	int			pin_attempts_left;
27327131187Sgerhard 	int			activation;
27427131187Sgerhard 	int			sim_state;
27527131187Sgerhard 	int			regstate;
27627131187Sgerhard 	int			regmode;
27727131187Sgerhard 	int			nwerror;
27827131187Sgerhard 	int			packetstate;
27927131187Sgerhard 	uint32_t		supportedclasses; /* what the hw supports */
28027131187Sgerhard 	uint32_t		preferredclasses; /* what the user prefers */
28127131187Sgerhard 	uint32_t		highestclass;	/* what the network offers */
28227131187Sgerhard 	uint32_t		cellclass;
28327131187Sgerhard #define UMB_PROVIDERNAME_MAXLEN		20
28427131187Sgerhard 	uint16_t		provider[UMB_PROVIDERNAME_MAXLEN];
2855a5baf73Ssthen #define UMB_PROVIDERID_MAXLEN		20
2865a5baf73Ssthen 	uint16_t		providerid[UMB_PROVIDERID_MAXLEN];
28727131187Sgerhard #define UMB_PHONENR_MAXLEN		22
28827131187Sgerhard 	uint16_t		pn[UMB_PHONENR_MAXLEN];
28927131187Sgerhard #define UMB_SUBSCRIBERID_MAXLEN		15
29027131187Sgerhard 	uint16_t		sid[UMB_SUBSCRIBERID_MAXLEN];
29127131187Sgerhard #define UMB_ICCID_MAXLEN		20
29227131187Sgerhard 	uint16_t		iccid[UMB_ICCID_MAXLEN];
29327131187Sgerhard #define UMB_ROAMINGTEXT_MAXLEN		63
29427131187Sgerhard 	uint16_t		roamingtxt[UMB_ROAMINGTEXT_MAXLEN];
29527131187Sgerhard 
29627131187Sgerhard #define UMB_DEVID_MAXLEN		18
29727131187Sgerhard 	uint16_t		devid[UMB_DEVID_MAXLEN];
29827131187Sgerhard #define UMB_FWINFO_MAXLEN		30
29927131187Sgerhard 	uint16_t		fwinfo[UMB_FWINFO_MAXLEN];
30027131187Sgerhard #define UMB_HWINFO_MAXLEN		30
30127131187Sgerhard 	uint16_t		hwinfo[UMB_HWINFO_MAXLEN];
30227131187Sgerhard 
30327131187Sgerhard 	uint16_t		apn[UMB_APN_MAXLEN];
30427131187Sgerhard 	int			apnlen;
30527131187Sgerhard 
30627131187Sgerhard #define UMB_VALUE_UNKNOWN	-999
30727131187Sgerhard 	int			rssi;
30827131187Sgerhard #define UMB_BER_EXCELLENT	0
30927131187Sgerhard #define UMB_BER_VERYGOOD	1
31027131187Sgerhard #define UMB_BER_GOOD		2
31127131187Sgerhard #define UMB_BER_OK		3
31227131187Sgerhard #define UMB_BER_MEDIUM		4
31327131187Sgerhard #define UMB_BER_BAD		5
31427131187Sgerhard #define UMB_BER_VERYBAD		6
31527131187Sgerhard #define UMB_BER_EXTREMELYBAD	7
31627131187Sgerhard 	int			ber;
31727131187Sgerhard 
31827131187Sgerhard 	int			hw_radio_on;
31927131187Sgerhard 	int			sw_radio_on;
32027131187Sgerhard 
32127131187Sgerhard 	uint64_t		uplink_speed;
32227131187Sgerhard 	uint64_t		downlink_speed;
32327131187Sgerhard 
32427131187Sgerhard #define UMB_MAX_DNSSRV			2
32599980cd5Sclaudio 	struct in_addr		ipv4dns[UMB_MAX_DNSSRV];
326e61a622dSgerhard 	struct in6_addr		ipv6dns[UMB_MAX_DNSSRV];
32727131187Sgerhard };
32827131187Sgerhard 
32927131187Sgerhard #ifdef _KERNEL
33027131187Sgerhard /*
33127131187Sgerhard  * UMB device
33227131187Sgerhard  */
33327131187Sgerhard struct umb_softc {
33427131187Sgerhard 	struct device		 sc_dev;
33527131187Sgerhard 	struct ifnet		 sc_if;
33627131187Sgerhard #define GET_IFP(sc)	(&(sc)->sc_if)
33727131187Sgerhard 	struct usbd_device	*sc_udev;
33827131187Sgerhard 
33927131187Sgerhard 	int			 sc_ver_maj;
34027131187Sgerhard 	int			 sc_ver_min;
34127131187Sgerhard 	int			 sc_ctrl_len;
34227131187Sgerhard 	int			 sc_maxpktlen;
34327131187Sgerhard 	int			 sc_maxsessions;
34483adad25Spatrick 	unsigned int		 sc_ncm_supported_formats;
34583adad25Spatrick 	int			 sc_ncm_format;
34627131187Sgerhard 
347ccb704bcSgerhard 	int			 sc_maxdgram;
348ccb704bcSgerhard 	int			 sc_align;
349ccb704bcSgerhard 	int			 sc_ndp_div;
350ccb704bcSgerhard 	int			 sc_ndp_remainder;
351ccb704bcSgerhard 
352f892d520Sgerhard #define UMBFLG_FCC_AUTH_REQUIRED	0x0001
353e61a622dSgerhard #define UMBFLG_NO_INET6			0x0002
354e77540adSpatrick #define UMBFLG_NDP_AT_END		0x0004
355f892d520Sgerhard 	uint32_t		 sc_flags;
356f892d520Sgerhard 	int			 sc_cid;
357f892d520Sgerhard 
35827131187Sgerhard 	struct usb_task		 sc_umb_task;
35927131187Sgerhard 	struct usb_task		 sc_get_response_task;
36027131187Sgerhard 	int			 sc_nresp;
36127131187Sgerhard 	struct timeout		 sc_statechg_timer;
36227131187Sgerhard 
36327131187Sgerhard 	uint8_t			 sc_ctrl_ifaceno;
36427131187Sgerhard 	struct usbd_pipe	*sc_ctrl_pipe;
36527131187Sgerhard 	struct usb_cdc_notification sc_intr_msg;
36627131187Sgerhard 	struct usbd_interface	*sc_data_iface;
36727131187Sgerhard 
36827131187Sgerhard 	void			*sc_resp_buf;
36927131187Sgerhard 	void			*sc_ctrl_msg;
37027131187Sgerhard 
37127131187Sgerhard 	int			 sc_rx_ep;
37227131187Sgerhard 	struct usbd_xfer	*sc_rx_xfer;
37327131187Sgerhard 	void			*sc_rx_buf;
3741bfc9b14Sgerhard 	int			 sc_rx_bufsz;
37527131187Sgerhard 	struct usbd_pipe	*sc_rx_pipe;
37627131187Sgerhard 	unsigned		 sc_rx_nerr;
37727131187Sgerhard 
37827131187Sgerhard 	int			 sc_tx_ep;
37927131187Sgerhard 	struct usbd_xfer	*sc_tx_xfer;
38027131187Sgerhard 	void			*sc_tx_buf;
3811bfc9b14Sgerhard 	int			 sc_tx_bufsz;
38227131187Sgerhard 	struct usbd_pipe	*sc_tx_pipe;
383ccb704bcSgerhard 	struct mbuf_list	 sc_tx_ml;
38427131187Sgerhard 	uint32_t		 sc_tx_seq;
38527131187Sgerhard 
38627131187Sgerhard 	uint32_t		 sc_tid;
38727131187Sgerhard 
38827131187Sgerhard #define sc_state		sc_info.state
38927131187Sgerhard #define sc_roaming		sc_info.enable_roaming
39027131187Sgerhard 	struct umb_info		 sc_info;
391*16cce00fSdlg 
392*16cce00fSdlg 	struct rwlock		 sc_kstat_lock;
393*16cce00fSdlg 	struct kstat		*sc_kstat_signal;
39427131187Sgerhard };
39527131187Sgerhard #endif /* _KERNEL */
396