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