1/*	$NetBSD: if_umbreg.h,v 1.2 2020/03/21 06:54:32 skrll Exp $ */
2/*	$OpenBSD: if_umb.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 _IF_UMBREG_H_
26#define _IF_UMBREG_H_
27
28struct umb_valdescr {
29	int		 val;
30	char const	*descr;
31};
32
33static const char *
34umb_val2descr(const struct umb_valdescr *vdp, int val)
35{
36	static char sval[32];
37
38	while (vdp->descr != NULL) {
39		if (vdp->val == val)
40			return vdp->descr;
41		vdp++;
42	}
43	snprintf(sval, sizeof(sval), "#%d", val);
44	return sval;
45}
46
47#define MBIM_REGSTATE_DESCRIPTIONS {				\
48	{ MBIM_REGSTATE_UNKNOWN,	"unknown" },		\
49	{ MBIM_REGSTATE_DEREGISTERED,	"not registered" },	\
50	{ MBIM_REGSTATE_SEARCHING,	"searching" },		\
51	{ MBIM_REGSTATE_HOME,		"home network" },	\
52	{ MBIM_REGSTATE_ROAMING,	"roaming network" },	\
53	{ MBIM_REGSTATE_PARTNER,	"partner network" },	\
54	{ MBIM_REGSTATE_DENIED,		"access denied" },	\
55	{ 0, NULL } }
56
57#define MBIM_DATACLASS_DESCRIPTIONS {					\
58	{ MBIM_DATACLASS_NONE,				"none" },	\
59	{ MBIM_DATACLASS_GPRS,				"GPRS" },	\
60	{ MBIM_DATACLASS_EDGE,				"EDGE" },	\
61	{ MBIM_DATACLASS_UMTS,				"UMTS" },	\
62	{ MBIM_DATACLASS_HSDPA,				"HSDPA" },	\
63	{ MBIM_DATACLASS_HSUPA,				"HSUPA" },	\
64	{ MBIM_DATACLASS_HSDPA|MBIM_DATACLASS_HSUPA,	"HSPA" },	\
65	{ MBIM_DATACLASS_LTE,				"LTE" },	\
66	{ MBIM_DATACLASS_1XRTT,				"CDMA2000" },	\
67	{ MBIM_DATACLASS_1XEVDO,			"CDMA2000" },	\
68	{ MBIM_DATACLASS_1XEVDO_REV_A,			"CDMA2000" },	\
69	{ MBIM_DATACLASS_1XEVDV,			"CDMA2000" },	\
70	{ MBIM_DATACLASS_3XRTT,				"CDMA2000" },	\
71	{ MBIM_DATACLASS_1XEVDO_REV_B,			"CDMA2000" },	\
72	{ MBIM_DATACLASS_UMB,				"CDMA2000" },	\
73	{ MBIM_DATACLASS_CUSTOM,			"custom" },	\
74	{ 0, NULL } }
75
76#define MBIM_1TO1_DESCRIPTION(m)	{ (m), #m }
77#define MBIM_MESSAGES_DESCRIPTIONS {				\
78	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_MSG),			\
79	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_MSG),			\
80	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_MSG),		\
81	MBIM_1TO1_DESCRIPTION(MBIM_HOST_ERROR_MSG),		\
82	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_DONE),			\
83	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_DONE),			\
84	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_DONE),		\
85	MBIM_1TO1_DESCRIPTION(MBIM_FUNCTION_ERROR_MSG),		\
86	MBIM_1TO1_DESCRIPTION(MBIM_INDICATE_STATUS_MSG),	\
87	{ 0, NULL } }
88
89#define MBIM_STATUS_DESCRIPTION(m)	{ MBIM_STATUS_ ## m, #m }
90#define MBIM_STATUS_DESCRIPTIONS {					\
91	MBIM_STATUS_DESCRIPTION(SUCCESS),				\
92	MBIM_STATUS_DESCRIPTION(BUSY),					\
93	MBIM_STATUS_DESCRIPTION(FAILURE),				\
94	MBIM_STATUS_DESCRIPTION(SIM_NOT_INSERTED),			\
95	MBIM_STATUS_DESCRIPTION(BAD_SIM),				\
96	MBIM_STATUS_DESCRIPTION(PIN_REQUIRED),				\
97	MBIM_STATUS_DESCRIPTION(PIN_DISABLED),				\
98	MBIM_STATUS_DESCRIPTION(NOT_REGISTERED),			\
99	MBIM_STATUS_DESCRIPTION(PROVIDERS_NOT_FOUND),			\
100	MBIM_STATUS_DESCRIPTION(NO_DEVICE_SUPPORT),			\
101	MBIM_STATUS_DESCRIPTION(PROVIDER_NOT_VISIBLE),			\
102	MBIM_STATUS_DESCRIPTION(DATA_CLASS_NOT_AVAILABLE),		\
103	MBIM_STATUS_DESCRIPTION(PACKET_SERVICE_DETACHED),		\
104	MBIM_STATUS_DESCRIPTION(MAX_ACTIVATED_CONTEXTS),		\
105	MBIM_STATUS_DESCRIPTION(NOT_INITIALIZED),			\
106	MBIM_STATUS_DESCRIPTION(VOICE_CALL_IN_PROGRESS),		\
107	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_ACTIVATED),			\
108	MBIM_STATUS_DESCRIPTION(SERVICE_NOT_ACTIVATED),			\
109	MBIM_STATUS_DESCRIPTION(INVALID_ACCESS_STRING),			\
110	MBIM_STATUS_DESCRIPTION(INVALID_USER_NAME_PWD),			\
111	MBIM_STATUS_DESCRIPTION(RADIO_POWER_OFF),			\
112	MBIM_STATUS_DESCRIPTION(INVALID_PARAMETERS),			\
113	MBIM_STATUS_DESCRIPTION(READ_FAILURE),				\
114	MBIM_STATUS_DESCRIPTION(WRITE_FAILURE),				\
115	MBIM_STATUS_DESCRIPTION(NO_PHONEBOOK),				\
116	MBIM_STATUS_DESCRIPTION(PARAMETER_TOO_LONG),			\
117	MBIM_STATUS_DESCRIPTION(STK_BUSY),				\
118	MBIM_STATUS_DESCRIPTION(OPERATION_NOT_ALLOWED),			\
119	MBIM_STATUS_DESCRIPTION(MEMORY_FAILURE),			\
120	MBIM_STATUS_DESCRIPTION(INVALID_MEMORY_INDEX),			\
121	MBIM_STATUS_DESCRIPTION(MEMORY_FULL),				\
122	MBIM_STATUS_DESCRIPTION(FILTER_NOT_SUPPORTED),			\
123	MBIM_STATUS_DESCRIPTION(DSS_INSTANCE_LIMIT),			\
124	MBIM_STATUS_DESCRIPTION(INVALID_DEVICE_SERVICE_OPERATION),	\
125	MBIM_STATUS_DESCRIPTION(AUTH_INCORRECT_AUTN),			\
126	MBIM_STATUS_DESCRIPTION(AUTH_SYNC_FAILURE),			\
127	MBIM_STATUS_DESCRIPTION(AUTH_AMF_NOT_SET),			\
128	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_SUPPORTED),			\
129	MBIM_STATUS_DESCRIPTION(SMS_UNKNOWN_SMSC_ADDRESS),		\
130	MBIM_STATUS_DESCRIPTION(SMS_NETWORK_TIMEOUT),			\
131	MBIM_STATUS_DESCRIPTION(SMS_LANG_NOT_SUPPORTED),		\
132	MBIM_STATUS_DESCRIPTION(SMS_ENCODING_NOT_SUPPORTED),		\
133	MBIM_STATUS_DESCRIPTION(SMS_FORMAT_NOT_SUPPORTED),		\
134	{ 0, NULL } }
135
136#define MBIM_ERROR_DESCRIPTION(m)	{ MBIM_ERROR_ ## m, #m }
137#define MBIM_ERROR_DESCRIPTIONS {					\
138	MBIM_ERROR_DESCRIPTION(TIMEOUT_FRAGMENT),			\
139	MBIM_ERROR_DESCRIPTION(FRAGMENT_OUT_OF_SEQUENCE),		\
140	MBIM_ERROR_DESCRIPTION(LENGTH_MISMATCH),			\
141	MBIM_ERROR_DESCRIPTION(DUPLICATED_TID),				\
142	MBIM_ERROR_DESCRIPTION(NOT_OPENED),				\
143	MBIM_ERROR_DESCRIPTION(UNKNOWN),				\
144	MBIM_ERROR_DESCRIPTION(CANCEL),					\
145	MBIM_ERROR_DESCRIPTION(MAX_TRANSFER),				\
146	{ 0, NULL } }
147
148#define MBIM_CID_DESCRIPTIONS {						\
149	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_CAPS),			\
150	MBIM_1TO1_DESCRIPTION(MBIM_CID_SUBSCRIBER_READY_STATUS),	\
151	MBIM_1TO1_DESCRIPTION(MBIM_CID_RADIO_STATE),			\
152	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN),				\
153	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN_LIST),			\
154	MBIM_1TO1_DESCRIPTION(MBIM_CID_HOME_PROVIDER),			\
155	MBIM_1TO1_DESCRIPTION(MBIM_CID_PREFERRED_PROVIDERS),		\
156	MBIM_1TO1_DESCRIPTION(MBIM_CID_VISIBLE_PROVIDERS),		\
157	MBIM_1TO1_DESCRIPTION(MBIM_CID_REGISTER_STATE),			\
158	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_SERVICE),			\
159	MBIM_1TO1_DESCRIPTION(MBIM_CID_SIGNAL_STATE),			\
160	MBIM_1TO1_DESCRIPTION(MBIM_CID_CONNECT),			\
161	MBIM_1TO1_DESCRIPTION(MBIM_CID_PROVISIONED_CONTEXTS),		\
162	MBIM_1TO1_DESCRIPTION(MBIM_CID_SERVICE_ACTIVATION),		\
163	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_CONFIGURATION),		\
164	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICES),		\
165	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST),	\
166	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_STATISTICS),		\
167	MBIM_1TO1_DESCRIPTION(MBIM_CID_NETWORK_IDLE_HINT),		\
168	MBIM_1TO1_DESCRIPTION(MBIM_CID_EMERGENCY_MODE),			\
169	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_PACKET_FILTERS),		\
170	MBIM_1TO1_DESCRIPTION(MBIM_CID_MULTICARRIER_PROVIDERS),		\
171	{ 0, NULL } }
172
173#define MBIM_SIMSTATE_DESCRIPTIONS {					\
174	{ MBIM_SIMSTATE_NOTINITIALIZED, "not initialized" },		\
175	{ MBIM_SIMSTATE_INITIALIZED, "initialized" },			\
176	{ MBIM_SIMSTATE_NOTINSERTED, "not inserted" },			\
177	{ MBIM_SIMSTATE_BADSIM, "bad type" },				\
178	{ MBIM_SIMSTATE_FAILURE, "failed" },				\
179	{ MBIM_SIMSTATE_NOTACTIVATED, "not activated" },		\
180	{ MBIM_SIMSTATE_LOCKED, "locked" },				\
181	{ 0, NULL } }
182
183#define MBIM_PINTYPE_DESCRIPTIONS {					\
184	{ MBIM_PIN_TYPE_NONE, "none" },					\
185	{ MBIM_PIN_TYPE_CUSTOM, "custom" },				\
186	{ MBIM_PIN_TYPE_PIN1, "PIN1" },					\
187	{ MBIM_PIN_TYPE_PIN2, "PIN2" },					\
188	{ MBIM_PIN_TYPE_DEV_SIM_PIN, "device PIN" },			\
189	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN, "device 1st PIN" },		\
190	{ MBIM_PIN_TYPE_NETWORK_PIN, "network PIN" },			\
191	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PIN, "network subset PIN" },	\
192	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN, "provider PIN" },		\
193	{ MBIM_PIN_TYPE_CORPORATE_PIN, "corporate PIN" },		\
194	{ MBIM_PIN_TYPE_SUBSIDY_LOCK, "subsidy lock" },			\
195	{ MBIM_PIN_TYPE_PUK1, "PUK" },					\
196	{ MBIM_PIN_TYPE_PUK2, "PUK2" },					\
197	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK, "device 1st PUK" },		\
198	{ MBIM_PIN_TYPE_NETWORK_PUK, "network PUK" },			\
199	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PUK, "network subset PUK" },	\
200	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK, "provider PUK" },		\
201	{ MBIM_PIN_TYPE_CORPORATE_PUK, "corporate PUK" },		\
202	{ 0, NULL } }
203
204#define MBIM_PKTSRV_STATE_DESCRIPTIONS {				\
205	{ MBIM_PKTSERVICE_STATE_UNKNOWN, "unknown" },			\
206	{ MBIM_PKTSERVICE_STATE_ATTACHING, "attaching" },		\
207	{ MBIM_PKTSERVICE_STATE_ATTACHED, "attached" },			\
208	{ MBIM_PKTSERVICE_STATE_DETACHING, "detaching" },		\
209	{ MBIM_PKTSERVICE_STATE_DETACHED, "detached" },			\
210	{ 0, NULL } }
211
212#define MBIM_ACTIVATION_STATE_DESCRIPTIONS {				\
213	{ MBIM_ACTIVATION_STATE_UNKNOWN, "unknown" },			\
214	{ MBIM_ACTIVATION_STATE_ACTIVATED, "activated" },		\
215	{ MBIM_ACTIVATION_STATE_ACTIVATING, "activating" },		\
216	{ MBIM_ACTIVATION_STATE_DEACTIVATED, "deactivated" },		\
217	{ MBIM_ACTIVATION_STATE_DEACTIVATING, "deactivating" },		\
218	{ 0, NULL } }
219
220/*
221 * Driver internal state
222 */
223enum umb_state {
224	UMB_S_DOWN = 0,		/* interface down */
225	UMB_S_OPEN,		/* MBIM device has been opened */
226	UMB_S_CID,		/* QMI client id allocated */
227	UMB_S_RADIO,		/* radio is on */
228	UMB_S_SIMREADY,		/* SIM is ready */
229	UMB_S_ATTACHED,		/* packet service is attached */
230	UMB_S_CONNECTED,	/* connected to provider */
231	UMB_S_UP,		/* have IP configuration */
232};
233
234#define UMB_INTERNAL_STATE_DESCRIPTIONS {	\
235	{ UMB_S_DOWN, "down" },			\
236	{ UMB_S_OPEN, "open" },			\
237	{ UMB_S_CID, "CID allocated" },		\
238	{ UMB_S_RADIO, "radio on" },		\
239	{ UMB_S_SIMREADY, "SIM is ready" },	\
240	{ UMB_S_ATTACHED, "attached" },		\
241	{ UMB_S_CONNECTED, "connected" },	\
242	{ UMB_S_UP, "up" },			\
243	{ 0, NULL } }
244
245/*
246 * UMB parameters (SIOC[GS]UMBPARAM ioctls)
247 */
248struct umb_parameter {
249	int			op;
250	int			is_puk;
251	uint16_t		pin[MBIM_PIN_MAXLEN];
252	int			pinlen;
253
254	char			newpin[MBIM_PIN_MAXLEN];
255	int			newpinlen;
256
257#define UMB_APN_MAXLEN		100
258	uint16_t		apn[UMB_APN_MAXLEN];
259	int			apnlen;
260
261#define UMB_USERNAME_MAXLEN	205
262	uint16_t		username[UMB_USERNAME_MAXLEN];
263	int			usernamelen;
264
265#define UMB_PASSWORD_MAXLEN	205
266	uint16_t		password[UMB_PASSWORD_MAXLEN];
267	int			passwordlen;
268
269	int			roaming;
270	uint32_t		preferredclasses;
271};
272
273/*
274 * UMB device status info (SIOCGUMBINFO ioctl)
275 */
276struct umb_info {
277	enum umb_state		state;
278	int			enable_roaming;
279#define UMB_PIN_REQUIRED	0
280#define UMB_PIN_UNLOCKED	1
281#define UMB_PUK_REQUIRED	2
282	int			pin_state;
283	int			pin_attempts_left;
284	int			activation;
285	int			sim_state;
286	int			regstate;
287	int			regmode;
288	int			nwerror;
289	int			packetstate;
290	uint32_t		supportedclasses; /* what the hw supports */
291	uint32_t		preferredclasses; /* what the user prefers */
292	uint32_t		highestclass;	/* what the network offers */
293	uint32_t		cellclass;
294#define UMB_PROVIDERNAME_MAXLEN		20
295	uint16_t		provider[UMB_PROVIDERNAME_MAXLEN];
296#define UMB_PHONENR_MAXLEN		22
297	uint16_t		pn[UMB_PHONENR_MAXLEN];
298#define UMB_SUBSCRIBERID_MAXLEN		15
299	uint16_t		sid[UMB_SUBSCRIBERID_MAXLEN];
300#define UMB_ICCID_MAXLEN		20
301	uint16_t		iccid[UMB_ICCID_MAXLEN];
302#define UMB_ROAMINGTEXT_MAXLEN		63
303	uint16_t		roamingtxt[UMB_ROAMINGTEXT_MAXLEN];
304
305#define UMB_DEVID_MAXLEN		18
306	uint16_t		devid[UMB_DEVID_MAXLEN];
307#define UMB_FWINFO_MAXLEN		30
308	uint16_t		fwinfo[UMB_FWINFO_MAXLEN];
309#define UMB_HWINFO_MAXLEN		30
310	uint16_t		hwinfo[UMB_HWINFO_MAXLEN];
311
312	uint16_t		apn[UMB_APN_MAXLEN];
313	int			apnlen;
314
315	uint16_t		username[UMB_USERNAME_MAXLEN];
316	int			usernamelen;
317
318	uint16_t		password[UMB_PASSWORD_MAXLEN];
319	int			passwordlen;
320
321#define UMB_VALUE_UNKNOWN	-999
322	int			rssi;
323#define UMB_BER_EXCELLENT	0
324#define UMB_BER_VERYGOOD	1
325#define UMB_BER_GOOD		2
326#define UMB_BER_OK		3
327#define UMB_BER_MEDIUM		4
328#define UMB_BER_BAD		5
329#define UMB_BER_VERYBAD		6
330#define UMB_BER_EXTREMELYBAD	7
331	int			ber;
332
333	int			hw_radio_on;
334	int			sw_radio_on;
335
336	uint64_t		uplink_speed;
337	uint64_t		downlink_speed;
338
339#define UMB_MAX_DNSSRV			2
340	u_int32_t		ipv4dns[UMB_MAX_DNSSRV];
341};
342
343#if !defined(ifr_mtu)
344#define ifr_mtu	ifr_ifru.ifru_metric
345#endif
346
347#ifdef _KERNEL
348/*
349 * UMB device
350 */
351struct umb_softc {
352	device_t		 sc_dev;
353	struct ifnet		 sc_if;
354#define GET_IFP(sc)	(&(sc)->sc_if)
355	struct ifmedia		 sc_im;
356	krndsource_t		 sc_rnd_source;
357	struct usbd_device	*sc_udev;
358
359	int			 sc_ver_maj;
360	int			 sc_ver_min;
361	int			 sc_ctrl_len;
362	int			 sc_maxpktlen;
363	int			 sc_maxsessions;
364
365#define UMBFLG_FCC_AUTH_REQUIRED	0x0001
366	uint32_t		 sc_flags;
367	int			 sc_cid;
368
369	struct usb_task		 sc_umb_task;
370	struct usb_task		 sc_get_response_task;
371	int			 sc_nresp;
372	callout_t		 sc_statechg_timer;
373	char			 sc_dying;
374	char			 sc_attached;
375
376	uint8_t			 sc_ctrl_ifaceno;
377	struct usbd_pipe	*sc_ctrl_pipe;
378	usb_cdc_notification_t	 sc_intr_msg;
379	struct usbd_interface	*sc_data_iface;
380
381	void			*sc_resp_buf;
382	void			*sc_ctrl_msg;
383
384	int			 sc_rx_ep;
385	struct usbd_xfer	*sc_rx_xfer;
386	char			*sc_rx_buf;
387	int			 sc_rx_bufsz;
388	struct usbd_pipe	*sc_rx_pipe;
389	unsigned		 sc_rx_nerr;
390
391	int			 sc_tx_ep;
392	struct usbd_xfer	*sc_tx_xfer;
393	char			*sc_tx_buf;
394	int			 sc_tx_bufsz;
395	struct usbd_pipe	*sc_tx_pipe;
396	struct mbuf		*sc_tx_m;
397	uint32_t		 sc_tx_seq;
398
399	uint32_t		 sc_tid;
400
401#define sc_state		sc_info.state
402#define sc_roaming		sc_info.enable_roaming
403	struct umb_info		sc_info;
404};
405#endif /* _KERNEL */
406
407#endif /* _IF_UMBREG_H_ */
408