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