1/* $NetBSD: mbim.h,v 1.2 2021/08/26 21:33:36 andvar Exp $ */ 2/* $OpenBSD: mbim.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 _MBIM_H_ 26#define _MBIM_H_ 27 28#define UDESCSUB_MBIM 27 29#define MBIM_INTERFACE_ALTSETTING 1 30 31#define MBIM_RESET_FUNCTION 0x05 32 33/* 34 * Registration state (MBIM_REGISTER_STATE) 35 */ 36#define MBIM_REGSTATE_UNKNOWN 0 37#define MBIM_REGSTATE_DEREGISTERED 1 38#define MBIM_REGSTATE_SEARCHING 2 39#define MBIM_REGSTATE_HOME 3 40#define MBIM_REGSTATE_ROAMING 4 41#define MBIM_REGSTATE_PARTNER 5 42#define MBIM_REGSTATE_DENIED 6 43 44/* 45 * Data classes mask (MBIM_DATA_CLASS) 46 */ 47#define MBIM_DATACLASS_NONE 0x00000000 48#define MBIM_DATACLASS_GPRS 0x00000001 49#define MBIM_DATACLASS_EDGE 0x00000002 50#define MBIM_DATACLASS_UMTS 0x00000004 51#define MBIM_DATACLASS_HSDPA 0x00000008 52#define MBIM_DATACLASS_HSUPA 0x00000010 53#define MBIM_DATACLASS_LTE 0x00000020 54#define MBIM_DATACLASS_1XRTT 0x00010000 55#define MBIM_DATACLASS_1XEVDO 0x00020000 56#define MBIM_DATACLASS_1XEVDO_REV_A 0x00040000 57#define MBIM_DATACLASS_1XEVDV 0x00080000 58#define MBIM_DATACLASS_3XRTT 0x00100000 59#define MBIM_DATACLASS_1XEVDO_REV_B 0x00200000 60#define MBIM_DATACLASS_UMB 0x00400000 61#define MBIM_DATACLASS_CUSTOM 0x80000000 62 63/* 64 * Cell classes mask (MBIM_CELLULAR_CLASS) 65 */ 66#define MBIM_CELLCLASS_GSM 0x00000001 67#define MBIM_CELLCLASS_CDMA 0x00000002 68 69/* 70 * UUIDs 71 */ 72#define MBIM_UUID_LEN 16 73 74#define MBIM_UUID_BASIC_CONNECT { \ 75 0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f, \ 76 0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6, 0xdf \ 77 } 78 79#define MBIM_UUID_CONTEXT_INTERNET { \ 80 0x7e, 0x5e, 0x2a, 0x7e, 0x4e, 0x6f, 0x72, 0x72, \ 81 0x73, 0x6b, 0x65, 0x6e, 0x7e, 0x5e, 0x2a, 0x7e \ 82 } 83 84#define MBIM_UUID_CONTEXT_VPN { \ 85 0x9b, 0x9f, 0x7b, 0xbe, 0x89, 0x52, 0x44, 0xb7, \ 86 0x83, 0xac, 0xca, 0x41, 0x31, 0x8d, 0xf7, 0xa0 \ 87 } 88 89#define MBIM_UUID_QMI_MBIM { \ 90 0xd1, 0xa3, 0x0b, 0xc2, 0xf9, 0x7a, 0x6e, 0x43, \ 91 0xbf, 0x65, 0xc7, 0xe2, 0x4f, 0xb0, 0xf0, 0xd3 \ 92 } 93 94#define MBIM_CTRLMSG_MINLEN 64 95#define MBIM_CTRLMSG_MAXLEN (4 * 1204) 96 97#define MBIM_MAXSEGSZ_MINVAL (2 * 1024) 98 99/* 100 * Control messages (host to function) 101 */ 102#define MBIM_OPEN_MSG 1U 103#define MBIM_CLOSE_MSG 2U 104#define MBIM_COMMAND_MSG 3U 105#define MBIM_HOST_ERROR_MSG 4U 106 107/* 108 * Control messages (function to host) 109 */ 110#define MBIM_OPEN_DONE 0x80000001U 111#define MBIM_CLOSE_DONE 0x80000002U 112#define MBIM_COMMAND_DONE 0x80000003U 113#define MBIM_FUNCTION_ERROR_MSG 0x80000004U 114#define MBIM_INDICATE_STATUS_MSG 0x80000007U 115 116/* 117 * Generic status codes 118 */ 119#define MBIM_STATUS_SUCCESS 0 120#define MBIM_STATUS_BUSY 1 121#define MBIM_STATUS_FAILURE 2 122#define MBIM_STATUS_SIM_NOT_INSERTED 3 123#define MBIM_STATUS_BAD_SIM 4 124#define MBIM_STATUS_PIN_REQUIRED 5 125#define MBIM_STATUS_PIN_DISABLED 6 126#define MBIM_STATUS_NOT_REGISTERED 7 127#define MBIM_STATUS_PROVIDERS_NOT_FOUND 8 128#define MBIM_STATUS_NO_DEVICE_SUPPORT 9 129#define MBIM_STATUS_PROVIDER_NOT_VISIBLE 10 130#define MBIM_STATUS_DATA_CLASS_NOT_AVAILABLE 11 131#define MBIM_STATUS_PACKET_SERVICE_DETACHED 12 132#define MBIM_STATUS_MAX_ACTIVATED_CONTEXTS 13 133#define MBIM_STATUS_NOT_INITIALIZED 14 134#define MBIM_STATUS_VOICE_CALL_IN_PROGRESS 15 135#define MBIM_STATUS_CONTEXT_NOT_ACTIVATED 16 136#define MBIM_STATUS_SERVICE_NOT_ACTIVATED 17 137#define MBIM_STATUS_INVALID_ACCESS_STRING 18 138#define MBIM_STATUS_INVALID_USER_NAME_PWD 19 139#define MBIM_STATUS_RADIO_POWER_OFF 20 140#define MBIM_STATUS_INVALID_PARAMETERS 21 141#define MBIM_STATUS_READ_FAILURE 22 142#define MBIM_STATUS_WRITE_FAILURE 23 143#define MBIM_STATUS_NO_PHONEBOOK 25 144#define MBIM_STATUS_PARAMETER_TOO_LONG 26 145#define MBIM_STATUS_STK_BUSY 27 146#define MBIM_STATUS_OPERATION_NOT_ALLOWED 28 147#define MBIM_STATUS_MEMORY_FAILURE 29 148#define MBIM_STATUS_INVALID_MEMORY_INDEX 30 149#define MBIM_STATUS_MEMORY_FULL 31 150#define MBIM_STATUS_FILTER_NOT_SUPPORTED 32 151#define MBIM_STATUS_DSS_INSTANCE_LIMIT 33 152#define MBIM_STATUS_INVALID_DEVICE_SERVICE_OPERATION 34 153#define MBIM_STATUS_AUTH_INCORRECT_AUTN 35 154#define MBIM_STATUS_AUTH_SYNC_FAILURE 36 155#define MBIM_STATUS_AUTH_AMF_NOT_SET 37 156#define MBIM_STATUS_CONTEXT_NOT_SUPPORTED 38 157#define MBIM_STATUS_SMS_UNKNOWN_SMSC_ADDRESS 100 158#define MBIM_STATUS_SMS_NETWORK_TIMEOUT 101 159#define MBIM_STATUS_SMS_LANG_NOT_SUPPORTED 102 160#define MBIM_STATUS_SMS_ENCODING_NOT_SUPPORTED 103 161#define MBIM_STATUS_SMS_FORMAT_NOT_SUPPORTED 104 162 163/* 164 * Message formats 165 */ 166struct mbim_msghdr { 167 /* Msg header */ 168 uint32_t type; /* message type */ 169 uint32_t len; /* message length */ 170 uint32_t tid; /* transaction id */ 171} __packed; 172 173struct mbim_fraghdr { 174 uint32_t nfrag; /* total # of fragments */ 175 uint32_t currfrag; /* current fragment */ 176} __packed; 177 178struct mbim_fragmented_msg_hdr { 179 struct mbim_msghdr hdr; 180 struct mbim_fraghdr frag; 181} __packed; 182 183struct mbim_h2f_openmsg { 184 struct mbim_msghdr hdr; 185 uint32_t maxlen; 186} __packed; 187 188struct mbim_h2f_closemsg { 189 struct mbim_msghdr hdr; 190} __packed; 191 192struct mbim_h2f_cmd { 193 struct mbim_msghdr hdr; 194 struct mbim_fraghdr frag; 195 uint8_t devid[MBIM_UUID_LEN]; 196 uint32_t cid; /* command id */ 197#define MBIM_CMDOP_QRY 0 198#define MBIM_CMDOP_SET 1 199 uint32_t op; 200 uint32_t infolen; 201 uint8_t info[]; 202} __packed; 203 204struct mbim_f2h_indicate_status { 205 struct mbim_msghdr hdr; 206 struct mbim_fraghdr frag; 207 uint8_t devid[MBIM_UUID_LEN]; 208 uint32_t cid; /* command id */ 209 uint32_t infolen; 210 uint8_t info[]; 211} __packed; 212 213struct mbim_f2h_hosterr { 214 struct mbim_msghdr hdr; 215 216#define MBIM_ERROR_TIMEOUT_FRAGMENT 1 217#define MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE 2 218#define MBIM_ERROR_LENGTH_MISMATCH 3 219#define MBIM_ERROR_DUPLICATED_TID 4 220#define MBIM_ERROR_NOT_OPENED 5 221#define MBIM_ERROR_UNKNOWN 6 222#define MBIM_ERROR_CANCEL 7 223#define MBIM_ERROR_MAX_TRANSFER 8 224 uint32_t err; 225} __packed; 226 227struct mbim_f2h_openclosedone { 228 struct mbim_msghdr hdr; 229 int32_t status; 230} __packed; 231 232struct mbim_f2h_cmddone { 233 struct mbim_msghdr hdr; 234 struct mbim_fraghdr frag; 235 uint8_t devid[MBIM_UUID_LEN]; 236 uint32_t cid; /* command id */ 237 int32_t status; 238 uint32_t infolen; 239 uint8_t info[]; 240} __packed; 241 242/* 243 * Messages and commands for MBIM_UUID_BASIC_CONNECT 244 */ 245#define MBIM_CID_DEVICE_CAPS 1 246#define MBIM_CID_SUBSCRIBER_READY_STATUS 2 247#define MBIM_CID_RADIO_STATE 3 248#define MBIM_CID_PIN 4 249#define MBIM_CID_PIN_LIST 5 250#define MBIM_CID_HOME_PROVIDER 6 251#define MBIM_CID_PREFERRED_PROVIDERS 7 252#define MBIM_CID_VISIBLE_PROVIDERS 8 253#define MBIM_CID_REGISTER_STATE 9 254#define MBIM_CID_PACKET_SERVICE 10 255#define MBIM_CID_SIGNAL_STATE 11 256#define MBIM_CID_CONNECT 12 257#define MBIM_CID_PROVISIONED_CONTEXTS 13 258#define MBIM_CID_SERVICE_ACTIVATION 14 259#define MBIM_CID_IP_CONFIGURATION 15 260#define MBIM_CID_DEVICE_SERVICES 16 261#define MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST 19 262#define MBIM_CID_PACKET_STATISTICS 20 263#define MBIM_CID_NETWORK_IDLE_HINT 21 264#define MBIM_CID_EMERGENCY_MODE 22 265#define MBIM_CID_IP_PACKET_FILTERS 23 266#define MBIM_CID_MULTICARRIER_PROVIDERS 24 267 268struct mbim_cid_subscriber_ready_info { 269#define MBIM_SIMSTATE_NOTINITIALIZED 0 270#define MBIM_SIMSTATE_INITIALIZED 1 271#define MBIM_SIMSTATE_NOTINSERTED 2 272#define MBIM_SIMSTATE_BADSIM 3 273#define MBIM_SIMSTATE_FAILURE 4 274#define MBIM_SIMSTATE_NOTACTIVATED 5 275#define MBIM_SIMSTATE_LOCKED 6 276 uint32_t ready; 277 278 uint32_t sid_offs; 279 uint32_t sid_size; 280 281 uint32_t icc_offs; 282 uint32_t icc_size; 283 284#define MBIM_SIMUNIQEID_NONE 0 285#define MBIM_SIMUNIQEID_PROTECT 1 286 uint32_t info; 287 288 uint32_t no_pn; 289 struct { 290 uint32_t offs; 291 uint32_t size; 292 } 293 pn[]; 294} __packed; 295 296struct mbim_cid_radio_state { 297#define MBIM_RADIO_STATE_OFF 0 298#define MBIM_RADIO_STATE_ON 1 299 uint32_t state; 300} __packed; 301 302struct mbim_cid_radio_state_info { 303 uint32_t hw_state; 304 uint32_t sw_state; 305} __packed; 306 307struct mbim_cid_pin { 308#define MBIM_PIN_TYPE_NONE 0 309#define MBIM_PIN_TYPE_CUSTOM 1 310#define MBIM_PIN_TYPE_PIN1 2 311#define MBIM_PIN_TYPE_PIN2 3 312#define MBIM_PIN_TYPE_DEV_SIM_PIN 4 313#define MBIM_PIN_TYPE_DEV_FIRST_SIM_PIN 5 314#define MBIM_PIN_TYPE_NETWORK_PIN 6 315#define MBIM_PIN_TYPE_NETWORK_SUBSET_PIN 7 316#define MBIM_PIN_TYPE_SERVICE_PROVIDER_PIN 8 317#define MBIM_PIN_TYPE_CORPORATE_PIN 9 318#define MBIM_PIN_TYPE_SUBSIDY_LOCK 10 319#define MBIM_PIN_TYPE_PUK1 11 320#define MBIM_PIN_TYPE_PUK2 12 321#define MBIM_PIN_TYPE_DEV_FIRST_SIM_PUK 13 322#define MBIM_PIN_TYPE_NETWORK_PUK 14 323#define MBIM_PIN_TYPE_NETWORK_SUBSET_PUK 15 324#define MBIM_PIN_TYPE_SERVICE_PROVIDER_PUK 16 325#define MBIM_PIN_TYPE_CORPORATE_PUK 17 326 uint32_t type; 327 328#define MBIM_PIN_OP_ENTER 0 329#define MBIM_PIN_OP_ENABLE 1 330#define MBIM_PIN_OP_DISABLE 2 331#define MBIM_PIN_OP_CHANGE 3 332 uint32_t op; 333 uint32_t pin_offs; 334 uint32_t pin_size; 335 uint32_t newpin_offs; 336 uint32_t newpin_size; 337#define MBIM_PIN_MAXLEN 32 338 uint8_t data[2 * MBIM_PIN_MAXLEN]; 339} __packed; 340 341struct mbim_cid_pin_info { 342 uint32_t type; 343 344#define MBIM_PIN_STATE_UNLOCKED 0 345#define MBIM_PIN_STATE_LOCKED 1 346 uint32_t state; 347 uint32_t remaining_attempts; 348} __packed; 349 350struct mbim_cid_pin_list_info { 351 struct mbim_pin_desc { 352 353#define MBIM_PINMODE_NOTSUPPORTED 0 354#define MBIM_PINMODE_ENABLED 1 355#define MBIM_PINMODE_DISABLED 2 356 uint32_t mode; 357 358#define MBIM_PINFORMAT_UNKNOWN 0 359#define MBIM_PINFORMAT_NUMERIC 1 360#define MBIM_PINFORMAT_ALPHANUMERIC 2 361 uint32_t format; 362 363 uint32_t minlen; 364 uint32_t maxlen; 365 } 366 pin1, 367 pin2, 368 dev_sim_pin, 369 first_dev_sim_pin, 370 net_pin, 371 net_sub_pin, 372 svp_pin, 373 corp_pin, 374 subsidy_lock, 375 custom; 376} __packed; 377 378struct mbim_cid_device_caps { 379#define MBIM_DEVTYPE_UNKNOWN 0 380#define MBIM_DEVTYPE_EMBEDDED 1 381#define MBIM_DEVTYPE_REMOVABLE 2 382#define MBIM_DEVTYPE_REMOTE 3 383 uint32_t devtype; 384 385 uint32_t cellclass; /* values: MBIM_CELLULAR_CLASS */ 386 uint32_t voiceclass; 387 uint32_t simclass; 388 uint32_t dataclass; /* values: MBIM_DATA_CLASS */ 389 uint32_t smscaps; 390 uint32_t cntrlcaps; 391 uint32_t max_sessions; 392 393 uint32_t custdataclass_offs; 394 uint32_t custdataclass_size; 395 396 uint32_t devid_offs; 397 uint32_t devid_size; 398 399 uint32_t fwinfo_offs; 400 uint32_t fwinfo_size; 401 402 uint32_t hwinfo_offs; 403 uint32_t hwinfo_size; 404 405 uint32_t data[]; 406} __packed; 407 408struct mbim_cid_registration_state { 409 uint32_t provid_offs; 410 uint32_t provid_size; 411 412#define MBIM_REGACTION_AUTOMATIC 0 413#define MBIM_REGACTION_MANUAL 1 414 uint32_t regaction; 415 uint32_t data_class; 416 417 uint32_t data[]; 418} __packed; 419 420struct mbim_cid_registration_state_info { 421 uint32_t nwerror; 422 423 uint32_t regstate; /* values: MBIM_REGISTER_STATE */ 424 425#define MBIM_REGMODE_UNKNOWN 0 426#define MBIM_REGMODE_AUTOMATIC 1 427#define MBIM_REGMODE_MANUAL 2 428 uint32_t regmode; 429 430 uint32_t availclasses; /* values: MBIM_DATA_CLASS */ 431 uint32_t curcellclass; /* values: MBIM_CELLULAR_CLASS */ 432 433 uint32_t provid_offs; 434 uint32_t provid_size; 435 436 uint32_t provname_offs; 437 uint32_t provname_size; 438 439 uint32_t roamingtxt_offs; 440 uint32_t roamingtxt_size; 441 442#define MBIM_REGFLAGS_NONE 0 443#define MBIM_REGFLAGS_MANUAL_NOT_AVAILABLE 1 444#define MBIM_REGFLAGS_PACKETSERVICE_AUTOATTACH 2 445 uint32_t regflag; 446 447 uint32_t data[]; 448} __packed; 449 450struct mbim_cid_packet_service { 451#define MBIM_PKTSERVICE_ACTION_ATTACH 0 452#define MBIM_PKTSERVICE_ACTION_DETACH 1 453 uint32_t action; 454} __packed; 455 456struct mbim_cid_packet_service_info { 457 uint32_t nwerror; 458 459#define MBIM_PKTSERVICE_STATE_UNKNOWN 0 460#define MBIM_PKTSERVICE_STATE_ATTACHING 1 461#define MBIM_PKTSERVICE_STATE_ATTACHED 2 462#define MBIM_PKTSERVICE_STATE_DETACHING 3 463#define MBIM_PKTSERVICE_STATE_DETACHED 4 464 uint32_t state; 465 466 uint32_t highest_dataclass; 467 uint64_t uplink_speed; 468 uint64_t downlink_speed; 469} __packed; 470 471struct mbim_cid_signal_state { 472 uint32_t rssi; 473 uint32_t err_rate; 474 uint32_t ss_intvl; 475 uint32_t rssi_thr; 476 uint32_t err_thr; 477} __packed; 478 479struct mbim_cid_connect { 480 uint32_t sessionid; 481 482#define MBIM_CONNECT_DEACTIVATE 0 483#define MBIM_CONNECT_ACTIVATE 1 484 uint32_t command; 485 486#define MBIM_ACCESS_MAXLEN 200 487 uint32_t access_offs; 488 uint32_t access_size; 489 490#define MBIM_USER_MAXLEN 510 491 uint32_t user_offs; 492 uint32_t user_size; 493 494#define MBIM_PASSWD_MAXLEN 510 495 uint32_t passwd_offs; 496 uint32_t passwd_size; 497 498#define MBIM_COMPRESSION_NONE 0 499#define MBIM_COMPRESSION_ENABLE 1 500 uint32_t compression; 501 502#define MBIM_AUTHPROT_NONE 0 503#define MBIM_AUTHPROT_PAP 1 504#define MBIM_AUTHPROT_CHAP 2 505#define MBIM_AUTHPROT_MSCHAP 3 506 uint32_t authprot; 507 508#define MBIM_CONTEXT_IPTYPE_DEFAULT 0 509#define MBIM_CONTEXT_IPTYPE_IPV4 1 510#define MBIM_CONTEXT_IPTYPE_IPV6 2 511#define MBIM_CONTEXT_IPTYPE_IPV4V6 3 512#define MBIM_CONTEXT_IPTYPE_IPV4ANDV6 4 513 uint32_t iptype; 514 515 uint8_t context[MBIM_UUID_LEN]; 516 517 uint8_t data[MBIM_ACCESS_MAXLEN + MBIM_USER_MAXLEN + 518 MBIM_PASSWD_MAXLEN]; 519 520} __packed; 521 522struct mbim_cid_connect_info { 523 uint32_t sessionid; 524 525#define MBIM_ACTIVATION_STATE_UNKNOWN 0 526#define MBIM_ACTIVATION_STATE_ACTIVATED 1 527#define MBIM_ACTIVATION_STATE_ACTIVATING 2 528#define MBIM_ACTIVATION_STATE_DEACTIVATED 3 529#define MBIM_ACTIVATION_STATE_DEACTIVATING 4 530 uint32_t activation; 531 532 uint32_t voice; 533 uint32_t iptype; 534 uint8_t context[MBIM_UUID_LEN]; 535 uint32_t nwerror; 536} __packed; 537 538struct mbim_cid_ipv4_element { 539 uint32_t prefixlen; 540 uint32_t addr; 541} __packed; 542 543struct mbim_cid_ipv6_element { 544 uint32_t prefixlen; 545 uint8_t addr[16]; 546} __packed; 547 548struct mbim_cid_ip_configuration_info { 549 uint32_t sessionid; 550 551#define MBIM_IPCONF_HAS_ADDRINFO 0x0001 552#define MBIM_IPCONF_HAS_GWINFO 0x0002 553#define MBIM_IPCONF_HAS_DNSINFO 0x0004 554#define MBIM_IPCONF_HAS_MTUINFO 0x0008 555 uint32_t ipv4_available; 556 uint32_t ipv6_available; 557 558 uint32_t ipv4_naddr; 559 uint32_t ipv4_addroffs; 560 uint32_t ipv6_naddr; 561 uint32_t ipv6_addroffs; 562 563 uint32_t ipv4_gwoffs; 564 uint32_t ipv6_gwoffs; 565 566 uint32_t ipv4_ndnssrv; 567 uint32_t ipv4_dnssrvoffs; 568 uint32_t ipv6_ndnssrv; 569 uint32_t ipv6_dnssrvoffs; 570 571 uint32_t ipv4_mtu; 572 uint32_t ipv6_mtu; 573 574 uint32_t data[]; 575} __packed; 576 577struct mbim_cid_packet_statistics_info { 578 uint32_t in_discards; 579 uint32_t in_errors; 580 uint64_t in_octets; 581 uint64_t in_packets; 582 uint64_t out_octets; 583 uint64_t out_packets; 584 uint32_t out_errors; 585 uint32_t out_discards; 586} __packed; 587 588 589#ifdef _KERNEL 590 591struct mbim_descriptor { 592 uByte bLength; 593 uByte bDescriptorType; 594 uByte bDescriptorSubtype; 595#define MBIM_VER_MAJOR(v) (((v) >> 8) & 0x0f) 596#define MBIM_VER_MINOR(v) ((v) & 0x0f) 597 uWord bcdMBIMVersion; 598 uWord wMaxControlMessage; 599 uByte bNumberFilters; 600 uByte bMaxFilterSize; 601 uWord wMaxSegmentSize; 602 uByte bmNetworkCapabilities; 603} __packed; 604 605/* 606 * NCM Parameters 607 */ 608#define NCM_GET_NTB_PARAMETERS 0x80 609 610struct ncm_ntb_parameters { 611 uWord wLength; 612 uWord bmNtbFormatsSupported; 613#define NCM_FORMAT_NTB16 0x0001 614#define NCM_FORMAT_NTB32 0x0002 615 uDWord dwNtbInMaxSize; 616 uWord wNtbInDivisor; 617 uWord wNtbInPayloadRemainder; 618 uWord wNtbInAlignment; 619 uWord wReserved1; 620 uDWord dwNtbOutMaxSize; 621 uWord wNtbOutDivisor; 622 uWord wNtbOutPayloadRemainder; 623 uWord wNtbOutAlignment; 624 uWord wNtbOutMaxDatagrams; 625} __packed; 626 627/* 628 * NCM Encoding 629 */ 630#define MBIM_HDR16_LEN \ 631 (sizeof(struct ncm_header16) + sizeof(struct ncm_pointer16)) 632#define MBIM_HDR32_LEN \ 633 (sizeof(struct ncm_header32) + sizeof(struct ncm_pointer32)) 634 635struct ncm_header16 { 636#define NCM_HDR16_SIG 0x484d434e 637 uDWord dwSignature; 638 uWord wHeaderLength; 639 uWord wSequence; 640 uWord wBlockLength; 641 uWord wNdpIndex; 642} __packed; 643 644struct ncm_header32 { 645#define NCM_HDR32_SIG 0x686d636e 646 uDWord dwSignature; 647 uWord wHeaderLength; 648 uWord wSequence; 649 uDWord dwBlockLength; 650 uDWord dwNdpIndex; 651} __packed; 652 653 654#define MBIM_NCM_NTH_SIDSHIFT 24 655#define MBIM_NCM_NTH_GETSID(s) (((s) > MBIM_NCM_NTH_SIDSHIFT) & 0xff) 656 657struct ncm_pointer16_dgram { 658 uWord wDatagramIndex; 659 uWord wDatagramLen; 660} __packed; 661 662struct ncm_pointer16 { 663#define MBIM_NCM_NTH16_IPS 0x00535049 664#define MBIM_NCM_NTH16_ISISG(s) (((s) & 0x00ffffff) == MBIM_NCM_NTH16_IPS) 665#define MBIM_NCM_NTH16_SIG(s) \ 666 ((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH16_IPS) 667 uDWord dwSignature; 668 uWord wLength; 669 uWord wNextNdpIndex; 670 671 /* Minimum is two datagrams, but can be more */ 672 struct ncm_pointer16_dgram dgram[2]; 673} __packed; 674 675struct ncm_pointer32_dgram { 676 uDWord dwDatagramIndex; 677 uDWord dwDatagramLen; 678} __packed; 679 680struct ncm_pointer32 { 681#define MBIM_NCM_NTH32_IPS 0x00737069 682#define MBIM_NCM_NTH32_ISISG(s) \ 683 (((s) & 0x00ffffff) == MBIM_NCM_NTH32_IPS) 684#define MBIM_NCM_NTH32_SIG(s) \ 685 ((((s) & 0xff) << MBIM_NCM_NTH_SIDSHIFT) | MBIM_NCM_NTH32_IPS) 686 uDWord dwSignature; 687 uWord wLength; 688 uWord wReserved6; 689 uDWord dwNextNdpIndex; 690 uDWord dwReserved12; 691 692 /* Minimum is two datagrams, but can be more */ 693 struct ncm_pointer32_dgram dgram[2]; 694} __packed; 695 696#endif /* _KERNEL */ 697 698#endif /* _MBIM_H_ */ 699