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 
28 struct umb_valdescr {
29           int                  val;
30           char const          *descr;
31 };
32 
33 static const char *
umb_val2descr(const struct umb_valdescr * vdp,int val)34 umb_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  */
223 enum 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  */
248 struct 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  */
276 struct 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  */
351 struct 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