xref: /freebsd/sys/dev/usb/net/if_umbreg.h (revision 0f1bf1c22a0c97e84a4db19197a75952487aa20b)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Original copyright (c) 2016 genua mbH (OpenBSD version)
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  * Copyright (c) 2022 ADISTA SAS (re-write for FreeBSD)
19  *
20  * Re-write for FreeBSD by Pierre Pronchery <pierre@defora.net>
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions are met:
24  *
25  * - Redistributions of source code must retain the above copyright notice,
26  *   this list of conditions and the following disclaimer.
27  * - Redistributions in binary form must reproduce the above copyright notice,
28  *   this list of conditions and the following disclaimer in the documentation
29  *   and/or other materials provided with the distribution.
30  * - Neither the name of the copyright holder nor the names of its contributors
31  *   may be used to endorse or promote products derived from this software
32  *   without specific prior written permission.
33  *
34  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
35  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
38  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
39  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
42  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
44  * POSSIBILITY OF SUCH DAMAGE.
45  *
46  * $OpenBSD: if_umb.h,v 1.4 2017/04/18 13:27:55 gerhard Exp $
47  */
48 
49 /*
50  * Mobile Broadband Interface Model
51  * http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
52  */
53 
54 struct umb_valdescr {
55 	int		 val;
56 	char const	*descr;
57 };
58 
59 static const char *
umb_val2descr(const struct umb_valdescr * vdp,int val)60 umb_val2descr(const struct umb_valdescr *vdp, int val)
61 {
62 	static char sval[32];
63 
64 	while (vdp->descr != NULL) {
65 		if (vdp->val == val)
66 			return vdp->descr;
67 		vdp++;
68 	}
69 	snprintf(sval, sizeof (sval), "#%d", val);
70 	return sval;
71 }
72 
73 #define MBIM_REGSTATE_DESCRIPTIONS {				\
74 	{ MBIM_REGSTATE_UNKNOWN,	"unknown" },		\
75 	{ MBIM_REGSTATE_DEREGISTERED,	"not registered" },	\
76 	{ MBIM_REGSTATE_SEARCHING,	"searching" },		\
77 	{ MBIM_REGSTATE_HOME,		"home network" },	\
78 	{ MBIM_REGSTATE_ROAMING,	"roaming network" },	\
79 	{ MBIM_REGSTATE_PARTNER,	"partner network" },	\
80 	{ MBIM_REGSTATE_DENIED,		"access denied" },	\
81 	{ 0, NULL } }
82 
83 #define MBIM_DATACLASS_DESCRIPTIONS {					\
84 	{ MBIM_DATACLASS_NONE,				"none" },	\
85 	{ MBIM_DATACLASS_GPRS,				"GPRS" },	\
86 	{ MBIM_DATACLASS_EDGE,				"EDGE" },	\
87 	{ MBIM_DATACLASS_UMTS,				"UMTS" },	\
88 	{ MBIM_DATACLASS_HSDPA,				"HSDPA" },	\
89 	{ MBIM_DATACLASS_HSUPA,				"HSUPA" },	\
90 	{ MBIM_DATACLASS_HSDPA|MBIM_DATACLASS_HSUPA,	"HSPA" },	\
91 	{ MBIM_DATACLASS_LTE,				"LTE" },	\
92 	{ MBIM_DATACLASS_1XRTT,				"CDMA2000" },	\
93 	{ MBIM_DATACLASS_1XEVDO,			"CDMA2000" },	\
94 	{ MBIM_DATACLASS_1XEVDO_REV_A,			"CDMA2000" },	\
95 	{ MBIM_DATACLASS_1XEVDV,			"CDMA2000" },	\
96 	{ MBIM_DATACLASS_3XRTT,				"CDMA2000" },	\
97 	{ MBIM_DATACLASS_1XEVDO_REV_B,			"CDMA2000" },	\
98 	{ MBIM_DATACLASS_UMB,				"CDMA2000" },	\
99 	{ MBIM_DATACLASS_CUSTOM,			"custom" },	\
100 	{ 0, NULL } }
101 
102 #define MBIM_1TO1_DESCRIPTION(m)	{ (m), #m }
103 #define MBIM_MESSAGES_DESCRIPTIONS {				\
104 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_MSG),			\
105 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_MSG),			\
106 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_MSG),		\
107 	MBIM_1TO1_DESCRIPTION(MBIM_HOST_ERROR_MSG),		\
108 	MBIM_1TO1_DESCRIPTION(MBIM_OPEN_DONE),			\
109 	MBIM_1TO1_DESCRIPTION(MBIM_CLOSE_DONE),			\
110 	MBIM_1TO1_DESCRIPTION(MBIM_COMMAND_DONE),		\
111 	MBIM_1TO1_DESCRIPTION(MBIM_FUNCTION_ERROR_MSG),		\
112 	MBIM_1TO1_DESCRIPTION(MBIM_INDICATE_STATUS_MSG),	\
113 	{ 0, NULL } }
114 
115 #define MBIM_STATUS_DESCRIPTION(m)	{ MBIM_STATUS_ ## m, #m }
116 #define MBIM_STATUS_DESCRIPTIONS {					\
117 	MBIM_STATUS_DESCRIPTION(SUCCESS),				\
118 	MBIM_STATUS_DESCRIPTION(BUSY),					\
119 	MBIM_STATUS_DESCRIPTION(FAILURE),				\
120 	MBIM_STATUS_DESCRIPTION(SIM_NOT_INSERTED),			\
121 	MBIM_STATUS_DESCRIPTION(BAD_SIM),				\
122 	MBIM_STATUS_DESCRIPTION(PIN_REQUIRED),				\
123 	MBIM_STATUS_DESCRIPTION(PIN_DISABLED),				\
124 	MBIM_STATUS_DESCRIPTION(NOT_REGISTERED),			\
125 	MBIM_STATUS_DESCRIPTION(PROVIDERS_NOT_FOUND),			\
126 	MBIM_STATUS_DESCRIPTION(NO_DEVICE_SUPPORT),			\
127 	MBIM_STATUS_DESCRIPTION(PROVIDER_NOT_VISIBLE),			\
128 	MBIM_STATUS_DESCRIPTION(DATA_CLASS_NOT_AVAILABLE),		\
129 	MBIM_STATUS_DESCRIPTION(PACKET_SERVICE_DETACHED),		\
130 	MBIM_STATUS_DESCRIPTION(MAX_ACTIVATED_CONTEXTS),		\
131 	MBIM_STATUS_DESCRIPTION(NOT_INITIALIZED),			\
132 	MBIM_STATUS_DESCRIPTION(VOICE_CALL_IN_PROGRESS),		\
133 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_ACTIVATED),			\
134 	MBIM_STATUS_DESCRIPTION(SERVICE_NOT_ACTIVATED),			\
135 	MBIM_STATUS_DESCRIPTION(INVALID_ACCESS_STRING),			\
136 	MBIM_STATUS_DESCRIPTION(INVALID_USER_NAME_PWD),			\
137 	MBIM_STATUS_DESCRIPTION(RADIO_POWER_OFF),			\
138 	MBIM_STATUS_DESCRIPTION(INVALID_PARAMETERS),			\
139 	MBIM_STATUS_DESCRIPTION(READ_FAILURE),				\
140 	MBIM_STATUS_DESCRIPTION(WRITE_FAILURE),				\
141 	MBIM_STATUS_DESCRIPTION(NO_PHONEBOOK),				\
142 	MBIM_STATUS_DESCRIPTION(PARAMETER_TOO_LONG),			\
143 	MBIM_STATUS_DESCRIPTION(STK_BUSY),				\
144 	MBIM_STATUS_DESCRIPTION(OPERATION_NOT_ALLOWED),			\
145 	MBIM_STATUS_DESCRIPTION(MEMORY_FAILURE),			\
146 	MBIM_STATUS_DESCRIPTION(INVALID_MEMORY_INDEX),			\
147 	MBIM_STATUS_DESCRIPTION(MEMORY_FULL),				\
148 	MBIM_STATUS_DESCRIPTION(FILTER_NOT_SUPPORTED),			\
149 	MBIM_STATUS_DESCRIPTION(DSS_INSTANCE_LIMIT),			\
150 	MBIM_STATUS_DESCRIPTION(INVALID_DEVICE_SERVICE_OPERATION),	\
151 	MBIM_STATUS_DESCRIPTION(AUTH_INCORRECT_AUTN),			\
152 	MBIM_STATUS_DESCRIPTION(AUTH_SYNC_FAILURE),			\
153 	MBIM_STATUS_DESCRIPTION(AUTH_AMF_NOT_SET),			\
154 	MBIM_STATUS_DESCRIPTION(CONTEXT_NOT_SUPPORTED),			\
155 	MBIM_STATUS_DESCRIPTION(SMS_UNKNOWN_SMSC_ADDRESS),		\
156 	MBIM_STATUS_DESCRIPTION(SMS_NETWORK_TIMEOUT),			\
157 	MBIM_STATUS_DESCRIPTION(SMS_LANG_NOT_SUPPORTED),		\
158 	MBIM_STATUS_DESCRIPTION(SMS_ENCODING_NOT_SUPPORTED),		\
159 	MBIM_STATUS_DESCRIPTION(SMS_FORMAT_NOT_SUPPORTED),		\
160 	{ 0, NULL } }
161 
162 #define MBIM_ERROR_DESCRIPTION(m)	{ MBIM_ERROR_ ## m, #m }
163 #define MBIM_ERROR_DESCRIPTIONS {					\
164 	MBIM_ERROR_DESCRIPTION(TIMEOUT_FRAGMENT),			\
165 	MBIM_ERROR_DESCRIPTION(FRAGMENT_OUT_OF_SEQUENCE),		\
166 	MBIM_ERROR_DESCRIPTION(LENGTH_MISMATCH),			\
167 	MBIM_ERROR_DESCRIPTION(DUPLICATED_TID),				\
168 	MBIM_ERROR_DESCRIPTION(NOT_OPENED),				\
169 	MBIM_ERROR_DESCRIPTION(UNKNOWN),				\
170 	MBIM_ERROR_DESCRIPTION(CANCEL),					\
171 	MBIM_ERROR_DESCRIPTION(MAX_TRANSFER),				\
172 	{ 0, NULL } }
173 
174 #define MBIM_CID_DESCRIPTIONS {						\
175 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_CAPS),			\
176 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SUBSCRIBER_READY_STATUS),	\
177 	MBIM_1TO1_DESCRIPTION(MBIM_CID_RADIO_STATE),			\
178 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN),				\
179 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PIN_LIST),			\
180 	MBIM_1TO1_DESCRIPTION(MBIM_CID_HOME_PROVIDER),			\
181 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PREFERRED_PROVIDERS),		\
182 	MBIM_1TO1_DESCRIPTION(MBIM_CID_VISIBLE_PROVIDERS),		\
183 	MBIM_1TO1_DESCRIPTION(MBIM_CID_REGISTER_STATE),			\
184 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_SERVICE),			\
185 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SIGNAL_STATE),			\
186 	MBIM_1TO1_DESCRIPTION(MBIM_CID_CONNECT),			\
187 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PROVISIONED_CONTEXTS),		\
188 	MBIM_1TO1_DESCRIPTION(MBIM_CID_SERVICE_ACTIVATION),		\
189 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_CONFIGURATION),		\
190 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICES),		\
191 	MBIM_1TO1_DESCRIPTION(MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST),	\
192 	MBIM_1TO1_DESCRIPTION(MBIM_CID_PACKET_STATISTICS),		\
193 	MBIM_1TO1_DESCRIPTION(MBIM_CID_NETWORK_IDLE_HINT),		\
194 	MBIM_1TO1_DESCRIPTION(MBIM_CID_EMERGENCY_MODE),			\
195 	MBIM_1TO1_DESCRIPTION(MBIM_CID_IP_PACKET_FILTERS),		\
196 	MBIM_1TO1_DESCRIPTION(MBIM_CID_MULTICARRIER_PROVIDERS),		\
197 	{ 0, NULL } }
198 
199 #define MBIM_SIMSTATE_DESCRIPTIONS {					\
200 	{ MBIM_SIMSTATE_NOTINITIALIZED, "not initialized" },		\
201 	{ MBIM_SIMSTATE_INITIALIZED, "initialized" },			\
202 	{ MBIM_SIMSTATE_NOTINSERTED, "not inserted" },			\
203 	{ MBIM_SIMSTATE_BADSIM, "bad type" },				\
204 	{ MBIM_SIMSTATE_FAILURE, "failed" },				\
205 	{ MBIM_SIMSTATE_NOTACTIVATED, "not activated" },		\
206 	{ MBIM_SIMSTATE_LOCKED, "locked" },				\
207 	{ 0, NULL } }
208 
209 #define MBIM_PINTYPE_DESCRIPTIONS {					\
210 	{ MBIM_PIN_TYPE_NONE, "none" },					\
211 	{ MBIM_PIN_TYPE_CUSTOM, "custom" },				\
212 	{ MBIM_PIN_TYPE_PIN1, "PIN1" },					\
213 	{ MBIM_PIN_TYPE_PIN2, "PIN2" },					\
214 	{ MBIM_PIN_TYPE_DEV_SIM_PIN, "device PIN" },			\
215 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN, "device 1st PIN" },		\
216 	{ MBIM_PIN_TYPE_NETWORK_PIN, "network PIN" },			\
217 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PIN, "network subset PIN" },	\
218 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN, "provider PIN" },		\
219 	{ MBIM_PIN_TYPE_CORPORATE_PIN, "corporate PIN" },		\
220 	{ MBIM_PIN_TYPE_SUBSIDY_LOCK, "subsidy lock" },			\
221 	{ MBIM_PIN_TYPE_PUK1, "PUK" },					\
222 	{ MBIM_PIN_TYPE_PUK2, "PUK2" },					\
223 	{ MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK, "device 1st PUK" },		\
224 	{ MBIM_PIN_TYPE_NETWORK_PUK, "network PUK" },			\
225 	{ MBIM_PIN_TYPE_NETWORK_SUBSET_PUK, "network subset PUK" },	\
226 	{ MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK, "provider PUK" },		\
227 	{ MBIM_PIN_TYPE_CORPORATE_PUK, "corporate PUK" },		\
228 	{ 0, NULL } }
229 
230 #define MBIM_PKTSRV_STATE_DESCRIPTIONS {				\
231 	{ MBIM_PKTSERVICE_STATE_UNKNOWN, "unknown" },			\
232 	{ MBIM_PKTSERVICE_STATE_ATTACHING, "attaching" },		\
233 	{ MBIM_PKTSERVICE_STATE_ATTACHED, "attached" },			\
234 	{ MBIM_PKTSERVICE_STATE_DETACHING, "detaching" },		\
235 	{ MBIM_PKTSERVICE_STATE_DETACHED, "detached" },			\
236 	{ 0, NULL } }
237 
238 #define MBIM_ACTIVATION_STATE_DESCRIPTIONS {				\
239 	{ MBIM_ACTIVATION_STATE_UNKNOWN, "unknown" },			\
240 	{ MBIM_ACTIVATION_STATE_ACTIVATED, "activated" },		\
241 	{ MBIM_ACTIVATION_STATE_ACTIVATING, "activating" },		\
242 	{ MBIM_ACTIVATION_STATE_DEACTIVATED, "deactivated" },		\
243 	{ MBIM_ACTIVATION_STATE_DEACTIVATING, "deactivating" },		\
244 	{ 0, NULL } }
245 
246 /*
247  * Driver internal state
248  */
249 enum umb_state {
250 	UMB_S_DOWN = 0,		/* interface down */
251 	UMB_S_OPEN,		/* MBIM device has been opened */
252 	UMB_S_CID,		/* QMI client id allocated */
253 	UMB_S_RADIO,		/* radio is on */
254 	UMB_S_SIMREADY,		/* SIM is ready */
255 	UMB_S_ATTACHED,		/* packet service is attached */
256 	UMB_S_CONNECTED,	/* connected to provider */
257 	UMB_S_UP,		/* have IP configuration */
258 };
259 
260 #define UMB_INTERNAL_STATE_DESCRIPTIONS {	\
261 	{ UMB_S_DOWN, "down" },			\
262 	{ UMB_S_OPEN, "open" },			\
263 	{ UMB_S_CID, "CID allocated" },		\
264 	{ UMB_S_RADIO, "radio on" },		\
265 	{ UMB_S_SIMREADY, "SIM is ready" },	\
266 	{ UMB_S_ATTACHED, "attached" },		\
267 	{ UMB_S_CONNECTED, "connected" },	\
268 	{ UMB_S_UP, "up" },			\
269 	{ 0, NULL } }
270 
271 /*
272  * UMB parameters (SIOC[GS]UMBPARAM ioctls)
273  */
274 struct umb_parameter {
275 	int			op;
276 	int			is_puk;
277 	uint16_t		pin[MBIM_PIN_MAXLEN];
278 	int			pinlen;
279 
280 	uint16_t		newpin[MBIM_PIN_MAXLEN];
281 	int			newpinlen;
282 
283 #define UMB_APN_MAXLEN		100
284 	uint16_t		apn[UMB_APN_MAXLEN];
285 	int			apnlen;
286 
287 #define UMB_USERNAME_MAXLEN	205
288 	uint16_t		username[UMB_USERNAME_MAXLEN];
289 	int			usernamelen;
290 
291 #define UMB_PASSWORD_MAXLEN	205
292 	uint16_t		password[UMB_PASSWORD_MAXLEN];
293 	int			passwordlen;
294 
295 	int			roaming;
296 	uint32_t		preferredclasses;
297 };
298 
299 /*
300  * UMB device status info (SIOCGUMBINFO ioctl)
301  */
302 struct umb_info {
303 	enum umb_state		state;
304 	int			enable_roaming;
305 #define UMB_PIN_REQUIRED	0
306 #define UMB_PIN_UNLOCKED	1
307 #define UMB_PUK_REQUIRED	2
308 	int			pin_state;
309 	int			pin_attempts_left;
310 	int			activation;
311 	int			sim_state;
312 	int			regstate;
313 	int			regmode;
314 	int			nwerror;
315 	int			packetstate;
316 	uint32_t		supportedclasses; /* what the hw supports */
317 	uint32_t		preferredclasses; /* what the user prefers */
318 	uint32_t		highestclass;	/* what the network offers */
319 	uint32_t		cellclass;
320 #define UMB_PROVIDERNAME_MAXLEN		20
321 	uint16_t		provider[UMB_PROVIDERNAME_MAXLEN];
322 #define UMB_PHONENR_MAXLEN		22
323 	uint16_t		pn[UMB_PHONENR_MAXLEN];
324 #define UMB_SUBSCRIBERID_MAXLEN		15
325 	uint16_t		sid[UMB_SUBSCRIBERID_MAXLEN];
326 #define UMB_ICCID_MAXLEN		20
327 	uint16_t		iccid[UMB_ICCID_MAXLEN];
328 #define UMB_ROAMINGTEXT_MAXLEN		63
329 	uint16_t		roamingtxt[UMB_ROAMINGTEXT_MAXLEN];
330 
331 #define UMB_DEVID_MAXLEN		18
332 	uint16_t		devid[UMB_DEVID_MAXLEN];
333 #define UMB_FWINFO_MAXLEN		30
334 	uint16_t		fwinfo[UMB_FWINFO_MAXLEN];
335 #define UMB_HWINFO_MAXLEN		30
336 	uint16_t		hwinfo[UMB_HWINFO_MAXLEN];
337 
338 	uint16_t		apn[UMB_APN_MAXLEN];
339 	int			apnlen;
340 
341 	uint16_t		username[UMB_USERNAME_MAXLEN];
342 	int			usernamelen;
343 
344 	uint16_t		password[UMB_PASSWORD_MAXLEN];
345 	int			passwordlen;
346 
347 #define UMB_VALUE_UNKNOWN	-999
348 	int			rssi;
349 #define UMB_BER_EXCELLENT	0
350 #define UMB_BER_VERYGOOD	1
351 #define UMB_BER_GOOD		2
352 #define UMB_BER_OK		3
353 #define UMB_BER_MEDIUM		4
354 #define UMB_BER_BAD		5
355 #define UMB_BER_VERYBAD		6
356 #define UMB_BER_EXTREMELYBAD	7
357 	int			ber;
358 
359 	int			hw_radio_on;
360 	int			sw_radio_on;
361 
362 	uint64_t		uplink_speed;
363 	uint64_t		downlink_speed;
364 
365 #define UMB_MAX_DNSSRV			2
366 	struct in_addr		ipv4dns[UMB_MAX_DNSSRV];
367 };
368 
369 #if !defined(ifr_mtu)
370 #define ifr_mtu	ifr_ifru.ifru_metric
371 #endif
372 
373 #ifdef _KERNEL
374 /*
375  * UMB device
376  */
377 enum {
378 	UMB_INTR_RX,
379 	UMB_BULK_RX,
380 	UMB_BULK_TX,
381 	UMB_N_TRANSFER,
382 };
383 
384 struct umb_task {
385 	struct usb_proc_msg	 hdr;
386 	struct umb_softc	*sc;
387 };
388 
389 struct umb_softc {
390 	device_t		 sc_dev;
391 	struct ifnet		*sc_if;
392 #define GET_IFP(sc)	((sc)->sc_if)
393 	struct ifmedia		 sc_im;
394 	struct usb_device	*sc_udev;
395 	struct usb_xfer		*sc_xfer[UMB_N_TRANSFER];
396 	uint8_t			 sc_ifaces_index[2];
397 
398 	int			 sc_ver_maj;
399 	int			 sc_ver_min;
400 	int			 sc_ctrl_len;
401 	int			 sc_maxpktlen;
402 	int			 sc_maxsessions;
403 
404 #define UMBFLG_FCC_AUTH_REQUIRED	0x0001
405 #define UMBFLG_NO_INET6			0x0002
406 	uint32_t		 sc_flags;
407 	int			 sc_cid;
408 
409 	struct usb_process	 sc_taskqueue;
410 	struct umb_task		 sc_proc_attach_task[2];
411 	struct umb_task		 sc_proc_start_task[2];
412 	struct umb_task		 sc_proc_state_task[2];
413 	struct umb_task		 sc_proc_get_response_task[2];
414 
415 	int			 sc_nresp;
416 	struct mtx		 sc_mutex;
417 	struct usb_callout	 sc_statechg_timer;
418 	char			 sc_dying;
419 	char			 sc_attached;
420 
421 	uint8_t			 sc_ctrl_ifaceno;
422 	struct usb_interface	*sc_data_iface;
423 
424 	void			*sc_resp_buf;
425 	void			*sc_ctrl_msg;
426 
427 	void			*sc_rx_buf;
428 	uint32_t		 sc_rx_bufsz;
429 	unsigned		 sc_rx_nerr;
430 	struct ifqueue		 sc_rx_queue;
431 
432 	void			*sc_tx_buf;
433 	struct mbuf		*sc_tx_m;
434 	uint32_t		 sc_tx_bufsz;
435 	uint32_t		 sc_tx_seq;
436 
437 	uint32_t		 sc_tid;
438 
439 #define sc_state		sc_info.state
440 #define sc_roaming		sc_info.enable_roaming
441 	struct umb_info		 sc_info;
442 };
443 #endif /* _KERNEL */
444