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 * 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