xref: /openbsd/sys/dev/usb/if_umb.h (revision 9b7c3dbb)
1 /*	$OpenBSD: if_umb.h,v 1.1 2016/06/15 19:39:34 gerhard Exp $ */
2 
3 /*
4  * Copyright (c) 2016 genua mbH
5  * All rights reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * Mobile Broadband Interface Model
22  * http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
23  */
24 
25 struct umb_valdescr {
26 	int	 val;
27 	char	*descr;
28 };
29 
30 static const char *
31 umb_val2descr(const struct umb_valdescr *vdp, int val)
32 {
33 	static char sval[32];
34 
35 	while (vdp->descr != NULL) {
36 		if (vdp->val == val)
37 			return vdp->descr;
38 		vdp++;
39 	}
40 	snprintf(sval, sizeof (sval), "#%d", val);
41 	return sval;
42 }
43 
44 #define MBIM_REGSTATE_DESCRIPTIONS {				\
45 	{ MBIM_REGSTATE_UNKNOWN,	"unknown" },		\
46 	{ MBIM_REGSTATE_DEREGISTERED,	"not registered" },	\
47 	{ MBIM_REGSTATE_SEARCHING,	"searching" },		\
48 	{ MBIM_REGSTATE_HOME,		"home network" },	\
49 	{ MBIM_REGSTATE_ROAMING,	"roaming network" },	\
50 	{ MBIM_REGSTATE_PARTNER,	"partner network" },	\
51 	{ MBIM_REGSTATE_DENIED,		"access denied" },	\
52 	{ 0, NULL } }
53 
54 #define MBIM_DATACLASS_DESCRIPTIONS {					\
55 	{ MBIM_DATACLASS_NONE,				"none" },	\
56 	{ MBIM_DATACLASS_GPRS,				"GPRS" },	\
57 	{ MBIM_DATACLASS_EDGE,				"EDGE" },	\
58 	{ MBIM_DATACLASS_UMTS,				"UMTS" },	\
59 	{ MBIM_DATACLASS_HSDPA,				"HSDPA" },	\
60 	{ MBIM_DATACLASS_HSUPA,				"HSUPA" },	\
61 	{ MBIM_DATACLASS_HSDPA|MBIM_DATACLASS_HSUPA,	"HSPA" },	\
62 	{ MBIM_DATACLASS_LTE,				"LTE" },	\
63 	{ MBIM_DATACLASS_1XRTT,				"CDMA2000" },	\
64 	{ MBIM_DATACLASS_1XEVDO,			"CDMA2000" },	\
65 	{ MBIM_DATACLASS_1XEVDO_REV_A,			"CDMA2000" },	\
66 	{ MBIM_DATACLASS_1XEVDV,			"CDMA2000" },	\
67 	{ MBIM_DATACLASS_3XRTT,				"CDMA2000" },	\
68 	{ MBIM_DATACLASS_1XEVDO_REV_B,			"CDMA2000" },	\
69 	{ MBIM_DATACLASS_UMB,				"CDMA2000" },	\
70 	{ MBIM_DATACLASS_CUSTOM,			"custom" },	\
71 	{ 0, NULL } }
72 
73 #define MBIM_1TO1_DESCRIPTION(m)	{ (m), #m }
74 #define MBIM_MESSAGES_DESCRIPTIONS {				\
75 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_MSG),			\
76 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_MSG),			\
77 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_MSG),		\
78 	MBIM_1TO1_DESCRIPTION(MBIM_HOST_ERROR_MSG),		\
79 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_DONE),			\
80 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_DONE),			\
81 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_DONE),		\
82 	MBIM_1TO1_DESCRIPTION(MBIM_FUNCTION_ERROR_MSG),		\
83 	MBIM_1TO1_DESCRIPTION(MBIM_INDICATE_STATUS_MSG),	\
84 	{ 0, NULL } }
85 
86 #define MBIM_STATUS_DESCRIPTION(m)	{ MBIM_STATUS_ ## m, #m }
87 #define MBIM_STATUS_DESCRIPTIONS {					\
88 	MBIM_STATUS_DESCRIPTION(SUCCESS),				\
89 	MBIM_STATUS_DESCRIPTION(BUSY),					\
90 	MBIM_STATUS_DESCRIPTION(FAILURE),				\
91 	MBIM_STATUS_DESCRIPTION(SIM_NOT_INSERTED),			\
92 	MBIM_STATUS_DESCRIPTION(BAD_SIM),				\
93 	MBIM_STATUS_DESCRIPTION(PIN_REQUIRED),				\
94 	MBIM_STATUS_DESCRIPTION(PIN_DISABLED),				\
95 	MBIM_STATUS_DESCRIPTION(NOT_REGISTERED),			\
96 	MBIM_STATUS_DESCRIPTION(PROVIDERS_NOT_FOUND),			\
97 	MBIM_STATUS_DESCRIPTION(NO_DEVICE_SUPPORT),			\
98 	MBIM_STATUS_DESCRIPTION(PROVIDER_NOT_VISIBLE),			\
99 	MBIM_STATUS_DESCRIPTION(DATA_CLASS_NOT_AVAILABLE),		\
100 	MBIM_STATUS_DESCRIPTION(PACKET_SERVICE_DETACHED),		\
101 	MBIM_STATUS_DESCRIPTION(MAX_ACTIVATED_CONTEXTS),		\
102 	MBIM_STATUS_DESCRIPTION(NOT_INITIALIZED),			\
103 	MBIM_STATUS_DESCRIPTION(VOICE_CALL_IN_PROGRESS),		\
104 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_ACTIVATED),			\
105 	MBIM_STATUS_DESCRIPTION(SERVICE_NOT_ACTIVATED),			\
106 	MBIM_STATUS_DESCRIPTION(INVALID_ACCESS_STRING),			\
107 	MBIM_STATUS_DESCRIPTION(INVALID_USER_NAME_PWD),			\
108 	MBIM_STATUS_DESCRIPTION(RADIO_POWER_OFF),			\
109 	MBIM_STATUS_DESCRIPTION(INVALID_PARAMETERS),			\
110 	MBIM_STATUS_DESCRIPTION(READ_FAILURE),				\
111 	MBIM_STATUS_DESCRIPTION(WRITE_FAILURE),				\
112 	MBIM_STATUS_DESCRIPTION(NO_PHONEBOOK),				\
113 	MBIM_STATUS_DESCRIPTION(PARAMETER_TOO_LONG),			\
114 	MBIM_STATUS_DESCRIPTION(STK_BUSY),				\
115 	MBIM_STATUS_DESCRIPTION(OPERATION_NOT_ALLOWED),			\
116 	MBIM_STATUS_DESCRIPTION(MEMORY_FAILURE),			\
117 	MBIM_STATUS_DESCRIPTION(INVALID_MEMORY_INDEX),			\
118 	MBIM_STATUS_DESCRIPTION(MEMORY_FULL),				\
119 	MBIM_STATUS_DESCRIPTION(FILTER_NOT_SUPPORTED),			\
120 	MBIM_STATUS_DESCRIPTION(DSS_INSTANCE_LIMIT),			\
121 	MBIM_STATUS_DESCRIPTION(INVALID_DEVICE_SERVICE_OPERATION),	\
122 	MBIM_STATUS_DESCRIPTION(AUTH_INCORRECT_AUTN),			\
123 	MBIM_STATUS_DESCRIPTION(AUTH_SYNC_FAILURE),			\
124 	MBIM_STATUS_DESCRIPTION(AUTH_AMF_NOT_SET),			\
125 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_SUPPORTED),			\
126 	MBIM_STATUS_DESCRIPTION(SMS_UNKNOWN_SMSC_ADDRESS),		\
127 	MBIM_STATUS_DESCRIPTION(SMS_NETWORK_TIMEOUT),			\
128 	MBIM_STATUS_DESCRIPTION(SMS_LANG_NOT_SUPPORTED),		\
129 	MBIM_STATUS_DESCRIPTION(SMS_ENCODING_NOT_SUPPORTED),		\
130 	MBIM_STATUS_DESCRIPTION(SMS_FORMAT_NOT_SUPPORTED),		\
131 	{ 0, NULL } }
132 
133 #define MBIM_ERROR_DESCRIPTION(m)	{ MBIM_ERROR_ ## m, #m }
134 #define MBIM_ERROR_DESCRIPTIONS {					\
135 	MBIM_ERROR_DESCRIPTION(TIMEOUT_FRAGMENT),			\
136 	MBIM_ERROR_DESCRIPTION(FRAGMENT_OUT_OF_SEQUENCE),		\
137 	MBIM_ERROR_DESCRIPTION(LENGTH_MISMATCH),			\
138 	MBIM_ERROR_DESCRIPTION(DUPLICATED_TID),				\
139 	MBIM_ERROR_DESCRIPTION(NOT_OPENED),				\
140 	MBIM_ERROR_DESCRIPTION(UNKNOWN),				\
141 	MBIM_ERROR_DESCRIPTION(CANCEL),					\
142 	MBIM_ERROR_DESCRIPTION(MAX_TRANSFER),				\
143 	{ 0, NULL } }
144 
145 #define MBIM_CID_DESCRIPTIONS {						\
146 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_CAPS),			\
147 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SUBSCRIBER_READY_STATUS),	\
148 	MBIM_1TO1_DESCRIPTION(MBIM_CID_RADIO_STATE),			\
149 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN),				\
150 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN_LIST),			\
151 	MBIM_1TO1_DESCRIPTION(MBIM_CID_HOME_PROVIDER),			\
152 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PREFERRED_PROVIDERS),		\
153 	MBIM_1TO1_DESCRIPTION(MBIM_CID_VISIBLE_PROVIDERS),		\
154 	MBIM_1TO1_DESCRIPTION(MBIM_CID_REGISTER_STATE),			\
155 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_SERVICE),			\
156 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SIGNAL_STATE),			\
157 	MBIM_1TO1_DESCRIPTION(MBIM_CID_CONNECT),			\
158 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PROVISIONED_CONTEXTS),		\
159 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SERVICE_ACTIVATION),		\
160 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_CONFIGURATION),		\
161 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICES),		\
162 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST),	\
163 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_STATISTICS),		\
164 	MBIM_1TO1_DESCRIPTION(MBIM_CID_NETWORK_IDLE_HINT),		\
165 	MBIM_1TO1_DESCRIPTION(MBIM_CID_EMERGENCY_MODE),			\
166 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_PACKET_FILTERS),		\
167 	MBIM_1TO1_DESCRIPTION(MBIM_CID_MULTICARRIER_PROVIDERS),		\
168 	{ 0, NULL } }
169 
170 #define MBIM_SIMSTATE_DESCRIPTIONS {					\
171 	{ MBIM_SIMSTATE_NOTINITIALIZED, "not initialized" },		\
172 	{ MBIM_SIMSTATE_INITIALIZED, "initialized" },			\
173 	{ MBIM_SIMSTATE_NOTINSERTED, "not inserted" },			\
174 	{ MBIM_SIMSTATE_BADSIM, "bad type" },				\
175 	{ MBIM_SIMSTATE_FAILURE, "failed" },				\
176 	{ MBIM_SIMSTATE_NOTACTIVATED, "not activated" },		\
177 	{ MBIM_SIMSTATE_LOCKED, "locked" },				\
178 	{ 0, NULL } }
179 
180 #define MBIM_PINTYPE_DESCRIPTIONS {					\
181 	{ MBIM_PIN_TYPE_NONE, "none" },					\
182 	{ MBIM_PIN_TYPE_CUSTOM, "custom" },				\
183 	{ MBIM_PIN_TYPE_PIN1, "PIN1" },					\
184 	{ MBIM_PIN_TYPE_PIN2, "PIN2" },					\
185 	{ MBIM_PIN_TYPE_DEV_SIM_PIN, "device PIN" },			\
186 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN, "device 1st PIN" },		\
187 	{ MBIM_PIN_TYPE_NETWORK_PIN, "network PIN" },			\
188 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PIN, "network subset PIN" },	\
189 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN, "provider PIN" },		\
190 	{ MBIM_PIN_TYPE_CORPORATE_PIN, "corporate PIN" },		\
191 	{ MBIM_PIN_TYPE_SUBSIDY_LOCK, "subsidy lock" },			\
192 	{ MBIM_PIN_TYPE_PUK1, "PUK" },					\
193 	{ MBIM_PIN_TYPE_PUK2, "PUK2" },					\
194 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK, "device 1st PUK" },		\
195 	{ MBIM_PIN_TYPE_NETWORK_PUK, "network PUK" },			\
196 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PUK, "network subset PUK" },	\
197 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK, "provider PUK" },		\
198 	{ MBIM_PIN_TYPE_CORPORATE_PUK, "corporate PUK" },		\
199 	{ 0, NULL } }
200 
201 #define MBIM_PKTSRV_STATE_DESCRIPTIONS {				\
202 	{ MBIM_PKTSERVICE_STATE_UNKNOWN, "unknown" },			\
203 	{ MBIM_PKTSERVICE_STATE_ATTACHING, "attaching" },		\
204 	{ MBIM_PKTSERVICE_STATE_ATTACHED, "attached" },			\
205 	{ MBIM_PKTSERVICE_STATE_DETACHING, "detaching" },		\
206 	{ MBIM_PKTSERVICE_STATE_DETACHED, "detached" },			\
207 	{ 0, NULL } }
208 
209 #define MBIM_ACTIVATION_STATE_DESCRIPTIONS {				\
210 	{ MBIM_ACTIVATION_STATE_UNKNOWN, "unknown" },			\
211 	{ MBIM_ACTIVATION_STATE_ACTIVATED, "activated" },		\
212 	{ MBIM_ACTIVATION_STATE_ACTIVATING, "activating" },		\
213 	{ MBIM_ACTIVATION_STATE_DEACTIVATED, "deactivated" },		\
214 	{ MBIM_ACTIVATION_STATE_DEACTIVATING, "deactivating" },		\
215 	{ 0, NULL } }
216 
217 /*
218  * Driver internal state
219  */
220 enum umb_state {
221 	UMB_S_DOWN = 0,		/* interface down */
222 	UMB_S_OPEN,		/* MBIM device has been opened */
223 	UMB_S_RADIO,		/* radio is on */
224 	UMB_S_SIMREADY,		/* SIM is ready */
225 	UMB_S_ATTACHED,		/* packet service is attached */
226 	UMB_S_CONNECTED,	/* connected to provider */
227 	UMB_S_UP,		/* have IP configuration */
228 };
229 
230 #define UMB_INTERNAL_STATE_DESCRIPTIONS {	\
231 	{ UMB_S_DOWN, "down" },		\
232 	{ UMB_S_OPEN, "open" },		\
233 	{ UMB_S_RADIO, "radio on" },		\
234 	{ UMB_S_SIMREADY, "SIM is ready" },	\
235 	{ UMB_S_ATTACHED, "attached" },	\
236 	{ UMB_S_CONNECTED, "connected" },	\
237 	{ UMB_S_UP, "up" },			\
238 	{ 0, NULL } }
239 
240 /*
241  * UMB parameters (SIOC[GS]UMBPARAM ioctls)
242  */
243 struct umb_parameter {
244 	int			op;
245 	int			is_puk;
246 	char			pin[MBIM_PIN_MAXLEN];
247 	int			pinlen;
248 
249 	char			newpin[MBIM_PIN_MAXLEN];
250 	int			newpinlen;
251 
252 #define UMB_APN_MAXLEN		100
253 	uint16_t		apn[UMB_APN_MAXLEN];
254 	int			apnlen;
255 
256 	int			roaming;
257 	uint32_t		preferredclasses;
258 };
259 
260 /*
261  * UMB device status info (SIOCGUMBINFO ioctl)
262  */
263 struct umb_info {
264 	enum umb_state		state;
265 	int			enable_roaming;
266 #define UMB_PIN_REQUIRED	0
267 #define UMB_PIN_UNLOCKED	1
268 #define UMB_PUK_REQUIRED	2
269 	int			pin_state;
270 	int			pin_attempts_left;
271 	int			activation;
272 	int			sim_state;
273 	int			regstate;
274 	int			regmode;
275 	int			nwerror;
276 	int			packetstate;
277 	uint32_t		supportedclasses; /* what the hw supports */
278 	uint32_t		preferredclasses; /* what the user prefers */
279 	uint32_t		highestclass;	/* what the network offers */
280 	uint32_t		cellclass;
281 #define UMB_PROVIDERNAME_MAXLEN		20
282 	uint16_t		provider[UMB_PROVIDERNAME_MAXLEN];
283 #define UMB_PHONENR_MAXLEN		22
284 	uint16_t		pn[UMB_PHONENR_MAXLEN];
285 #define UMB_SUBSCRIBERID_MAXLEN		15
286 	uint16_t		sid[UMB_SUBSCRIBERID_MAXLEN];
287 #define UMB_ICCID_MAXLEN		20
288 	uint16_t		iccid[UMB_ICCID_MAXLEN];
289 #define UMB_ROAMINGTEXT_MAXLEN		63
290 	uint16_t		roamingtxt[UMB_ROAMINGTEXT_MAXLEN];
291 
292 #define UMB_DEVID_MAXLEN		18
293 	uint16_t		devid[UMB_DEVID_MAXLEN];
294 #define UMB_FWINFO_MAXLEN		30
295 	uint16_t		fwinfo[UMB_FWINFO_MAXLEN];
296 #define UMB_HWINFO_MAXLEN		30
297 	uint16_t		hwinfo[UMB_HWINFO_MAXLEN];
298 
299 	uint16_t		apn[UMB_APN_MAXLEN];
300 	int			apnlen;
301 
302 #define UMB_VALUE_UNKNOWN	-999
303 	int			rssi;
304 #define UMB_BER_EXCELLENT	0
305 #define UMB_BER_VERYGOOD	1
306 #define UMB_BER_GOOD		2
307 #define UMB_BER_OK		3
308 #define UMB_BER_MEDIUM		4
309 #define UMB_BER_BAD		5
310 #define UMB_BER_VERYBAD		6
311 #define UMB_BER_EXTREMELYBAD	7
312 	int			ber;
313 
314 	int			hw_radio_on;
315 	int			sw_radio_on;
316 
317 	uint64_t		uplink_speed;
318 	uint64_t		downlink_speed;
319 
320 #define UMB_MAX_DNSSRV			2
321 	u_int32_t		ipv4dns[UMB_MAX_DNSSRV];
322 };
323 
324 #ifdef _KERNEL
325 /*
326  * UMB device
327  */
328 struct umb_softc {
329 	struct device		 sc_dev;
330 	struct ifnet		 sc_if;
331 #define GET_IFP(sc)	(&(sc)->sc_if)
332 	struct usbd_device	*sc_udev;
333 
334 	int			 sc_ver_maj;
335 	int			 sc_ver_min;
336 	int			 sc_ctrl_len;
337 	int			 sc_maxpktlen;
338 	int			 sc_maxsessions;
339 
340 	struct usb_task		 sc_umb_task;
341 	struct usb_task		 sc_get_response_task;
342 	int			 sc_nresp;
343 	struct timeout		 sc_statechg_timer;
344 
345 	uint8_t			 sc_ctrl_ifaceno;
346 	struct usbd_pipe	*sc_ctrl_pipe;
347 	struct usb_cdc_notification sc_intr_msg;
348 	struct usbd_interface	*sc_data_iface;
349 
350 	void			*sc_resp_buf;
351 	void			*sc_ctrl_msg;
352 
353 	int			 sc_rx_ep;
354 	struct usbd_xfer	*sc_rx_xfer;
355 	void			*sc_rx_buf;
356 	struct usbd_pipe	*sc_rx_pipe;
357 	unsigned		 sc_rx_nerr;
358 
359 	int			 sc_tx_ep;
360 	struct usbd_xfer	*sc_tx_xfer;
361 	void			*sc_tx_buf;
362 	struct usbd_pipe	*sc_tx_pipe;
363 	struct mbuf		*sc_tx_m;
364 	uint32_t		 sc_tx_seq;
365 
366 	uint32_t		 sc_tid;
367 
368 #define sc_state		sc_info.state
369 #define sc_roaming		sc_info.enable_roaming
370 	struct umb_info		sc_info;
371 };
372 #endif /* _KERNEL */
373