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