1 #include "qmi-message.h"
10 static void cmd_dms_get_capabilities_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
14 struct qmi_dms_get_capabilities_response res;
15 const char *radio_cap[] = {
16 [QMI_DMS_RADIO_INTERFACE_CDMA20001X] = "cdma1x",
17 [QMI_DMS_RADIO_INTERFACE_EVDO] = "cdma1xevdo",
18 [QMI_DMS_RADIO_INTERFACE_GSM] = "gsm",
19 [QMI_DMS_RADIO_INTERFACE_UMTS] = "umts",
20 [QMI_DMS_RADIO_INTERFACE_LTE] = "lte",
22 const char *service_cap[] = {
23 [QMI_DMS_DATA_SERVICE_CAPABILITY_NONE] = "none",
24 [QMI_DMS_DATA_SERVICE_CAPABILITY_CS] = "cs",
25 [QMI_DMS_DATA_SERVICE_CAPABILITY_PS] = "ps",
26 [QMI_DMS_DATA_SERVICE_CAPABILITY_SIMULTANEOUS_CS_PS] = "simultaneous_cs_ps",
27 [QMI_DMS_DATA_SERVICE_CAPABILITY_NON_SIMULTANEOUS_CS_PS] = "non_simultaneous_cs_ps",
30 qmi_parse_dms_get_capabilities_response(msg, &res);
32 t = blobmsg_open_table(&status, NULL);
34 blobmsg_add_u32(&status, "max_tx_channel_rate", (int32_t) res.data.info.max_tx_channel_rate);
35 blobmsg_add_u32(&status, "max_rx_channel_rate", (int32_t) res.data.info.max_rx_channel_rate);
36 if ((int)res.data.info.data_service_capability >= 0 && res.data.info.data_service_capability < ARRAY_SIZE(service_cap))
37 blobmsg_add_string(&status, "data_service", service_cap[res.data.info.data_service_capability]);
39 if(res.data.info.sim_capability == QMI_DMS_SIM_CAPABILITY_NOT_SUPPORTED)
40 blobmsg_add_string(&status, "sim", "not supported");
41 else if(res.data.info.sim_capability == QMI_DMS_SIM_CAPABILITY_SUPPORTED)
42 blobmsg_add_string(&status, "sim", "supported");
44 networks = blobmsg_open_array(&status, "networks");
45 for (i = 0; i < res.data.info.radio_interface_list_n; i++) {
46 if ((int)res.data.info.radio_interface_list[i] >= 0 && res.data.info.radio_interface_list[i] < ARRAY_SIZE(radio_cap))
47 blobmsg_add_string(&status, NULL, radio_cap[res.data.info.radio_interface_list[i]]);
49 blobmsg_add_string(&status, NULL, "unknown");
51 blobmsg_close_array(&status, networks);
53 blobmsg_close_table(&status, t);
56 static enum qmi_cmd_result
57 cmd_dms_get_capabilities_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
59 qmi_set_dms_get_capabilities_request(msg);
60 return QMI_CMD_REQUEST;
63 static const char *get_pin_status(int status)
65 static const char *pin_status[] = {
66 [QMI_DMS_UIM_PIN_STATUS_NOT_INITIALIZED] = "not_initialized",
67 [QMI_DMS_UIM_PIN_STATUS_ENABLED_NOT_VERIFIED] = "not_verified",
68 [QMI_DMS_UIM_PIN_STATUS_ENABLED_VERIFIED] = "verified",
69 [QMI_DMS_UIM_PIN_STATUS_DISABLED] = "disabled",
70 [QMI_DMS_UIM_PIN_STATUS_BLOCKED] = "blocked",
71 [QMI_DMS_UIM_PIN_STATUS_PERMANENTLY_BLOCKED] = "permanently_blocked",
72 [QMI_DMS_UIM_PIN_STATUS_UNBLOCKED] = "unblocked",
73 [QMI_DMS_UIM_PIN_STATUS_CHANGED] = "changed",
75 const char *res = "Unknown";
77 if (status < ARRAY_SIZE(pin_status) && pin_status[status])
78 res = pin_status[status];
83 static void cmd_dms_get_pin_status_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
85 struct qmi_dms_uim_get_pin_status_response res;
88 qmi_parse_dms_uim_get_pin_status_response(msg, &res);
89 c = blobmsg_open_table(&status, NULL);
90 if (res.set.pin1_status) {
91 blobmsg_add_string(&status, "pin1_status", get_pin_status(res.data.pin1_status.current_status));
92 blobmsg_add_u32(&status, "pin1_verify_tries", (int32_t) res.data.pin1_status.verify_retries_left);
93 blobmsg_add_u32(&status, "pin1_unblock_tries", (int32_t) res.data.pin1_status.unblock_retries_left);
95 if (res.set.pin2_status) {
96 blobmsg_add_string(&status, "pin2_status", get_pin_status(res.data.pin2_status.current_status));
97 blobmsg_add_u32(&status, "pin2_verify_tries", (int32_t) res.data.pin2_status.verify_retries_left);
98 blobmsg_add_u32(&status, "pin2_unblock_tries", (int32_t) res.data.pin2_status.unblock_retries_left);
100 blobmsg_close_table(&status, c);
103 static enum qmi_cmd_result
104 cmd_dms_get_pin_status_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
106 qmi_set_dms_uim_get_pin_status_request(msg);
107 return QMI_CMD_REQUEST;
110 #define cmd_dms_verify_pin1_cb no_cb
111 static enum qmi_cmd_result
112 cmd_dms_verify_pin1_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
114 struct qmi_dms_uim_verify_pin_request data = {
115 QMI_INIT_SEQUENCE(info,
116 .pin_id = QMI_DMS_UIM_PIN_ID_PIN,
120 qmi_set_dms_uim_verify_pin_request(msg, &data);
121 return QMI_CMD_REQUEST;
124 #define cmd_dms_verify_pin2_cb no_cb
125 static enum qmi_cmd_result
126 cmd_dms_verify_pin2_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
128 struct qmi_dms_uim_verify_pin_request data = {
129 QMI_INIT_SEQUENCE(info,
130 .pin_id = QMI_DMS_UIM_PIN_ID_PIN2,
134 qmi_set_dms_uim_verify_pin_request(msg, &data);
135 return QMI_CMD_REQUEST;
138 #define cmd_dms_set_pin_cb no_cb
139 static enum qmi_cmd_result
140 cmd_dms_set_pin_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
142 dms_req_data.pin = arg;
146 static enum qmi_cmd_result
147 cmd_dms_set_pin_protection_prepare(struct qmi_msg *msg, char *arg)
149 if (!dms_req_data.pin) {
150 uqmi_add_error("Missing argument");
155 if (strcasecmp(arg, "disabled") == 0)
157 else if (strcasecmp(arg, "enabled") == 0)
160 uqmi_add_error("Invalid value (valid: disabled, enabled)");
164 struct qmi_dms_uim_set_pin_protection_request dms_pin_protection_req = {
165 QMI_INIT_SEQUENCE(info,
166 .pin_id = dms_req_data.pin_id
168 QMI_INIT_PTR(info.pin, dms_req_data.pin),
169 QMI_INIT_PTR(info.protection_enabled, is_enabled)
172 qmi_set_dms_uim_set_pin_protection_request(msg, &dms_pin_protection_req);
173 return QMI_CMD_REQUEST;
176 #define cmd_dms_set_pin1_protection_cb no_cb
177 static enum qmi_cmd_result
178 cmd_dms_set_pin1_protection_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
180 dms_req_data.pin_id = QMI_DMS_UIM_PIN_ID_PIN;
181 return cmd_dms_set_pin_protection_prepare(msg, arg);
184 #define cmd_dms_set_pin2_protection_cb no_cb
185 static enum qmi_cmd_result
186 cmd_dms_set_pin2_protection_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
188 dms_req_data.pin_id = QMI_DMS_UIM_PIN_ID_PIN2;
189 return cmd_dms_set_pin_protection_prepare(msg, arg);
192 static enum qmi_cmd_result
193 cmd_dms_change_pin_prepare(struct qmi_msg *msg, char *arg)
195 if (!dms_req_data.pin || !dms_req_data.new_pin) {
196 uqmi_add_error("Missing argument");
200 struct qmi_dms_uim_change_pin_request dms_change_pin_req = {
201 QMI_INIT_SEQUENCE(info,
202 .pin_id = dms_req_data.pin_id
204 QMI_INIT_PTR(info.old_pin, dms_req_data.pin),
205 QMI_INIT_PTR(info.new_pin, dms_req_data.new_pin)
208 qmi_set_dms_uim_change_pin_request(msg, &dms_change_pin_req);
209 return QMI_CMD_REQUEST;
212 #define cmd_dms_change_pin1_cb no_cb
213 static enum qmi_cmd_result
214 cmd_dms_change_pin1_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
216 dms_req_data.pin_id = QMI_DMS_UIM_PIN_ID_PIN;
217 return cmd_dms_change_pin_prepare(msg, arg);
220 #define cmd_dms_change_pin2_cb no_cb
221 static enum qmi_cmd_result
222 cmd_dms_change_pin2_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
224 dms_req_data.pin_id = QMI_DMS_UIM_PIN_ID_PIN2;
225 return cmd_dms_change_pin_prepare(msg, arg);
228 #define cmd_dms_set_new_pin_cb no_cb
229 static enum qmi_cmd_result
230 cmd_dms_set_new_pin_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
232 dms_req_data.new_pin = arg;
236 #define cmd_dms_set_puk_cb no_cb
237 static enum qmi_cmd_result
238 cmd_dms_set_puk_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
240 dms_req_data.puk = arg;
244 #define cmd_dms_unblock_pin1_cb no_cb
245 static enum qmi_cmd_result
246 cmd_dms_unblock_pin1_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
248 if (!dms_req_data.puk || !dms_req_data.new_pin) {
249 uqmi_add_error("Missing argument");
253 struct qmi_dms_uim_unblock_pin_request dms_unlock_pin_req = {
254 QMI_INIT_SEQUENCE(info,
255 .pin_id = QMI_DMS_UIM_PIN_ID_PIN
257 QMI_INIT_PTR(info.puk, dms_req_data.puk),
258 QMI_INIT_PTR(info.new_pin, dms_req_data.new_pin)
261 qmi_set_dms_uim_unblock_pin_request(msg, &dms_unlock_pin_req);
262 return QMI_CMD_REQUEST;
265 #define cmd_dms_unblock_pin2_cb no_cb
266 static enum qmi_cmd_result
267 cmd_dms_unblock_pin2_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
269 if (!dms_req_data.puk || !dms_req_data.new_pin) {
270 uqmi_add_error("Missing argument");
274 struct qmi_dms_uim_unblock_pin_request dms_unlock_pin_req = {
275 QMI_INIT_SEQUENCE(info,
276 .pin_id = QMI_DMS_UIM_PIN_ID_PIN2
278 QMI_INIT_PTR(info.puk, dms_req_data.puk),
279 QMI_INIT_PTR(info.new_pin, dms_req_data.new_pin)
282 qmi_set_dms_uim_unblock_pin_request(msg, &dms_unlock_pin_req);
283 return QMI_CMD_REQUEST;
286 static void cmd_dms_get_iccid_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
288 struct qmi_dms_uim_get_iccid_response res;
290 qmi_parse_dms_uim_get_iccid_response(msg, &res);
292 blobmsg_add_string(&status, NULL, res.data.iccid);
295 static enum qmi_cmd_result
296 cmd_dms_get_iccid_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
298 qmi_set_dms_uim_get_iccid_request(msg);
299 return QMI_CMD_REQUEST;
302 static void cmd_dms_get_imsi_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
304 struct qmi_dms_uim_get_imsi_response res;
306 qmi_parse_dms_uim_get_imsi_response(msg, &res);
308 blobmsg_add_string(&status, NULL, res.data.imsi);
311 static enum qmi_cmd_result
312 cmd_dms_get_imsi_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
314 qmi_set_dms_uim_get_imsi_request(msg);
315 return QMI_CMD_REQUEST;
318 static void cmd_dms_get_msisdn_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
320 struct qmi_dms_get_msisdn_response res;
322 qmi_parse_dms_get_msisdn_response(msg, &res);
324 blobmsg_add_string(&status, NULL, res.data.msisdn);
327 static enum qmi_cmd_result
328 cmd_dms_get_msisdn_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
330 qmi_set_dms_get_msisdn_request(msg);
331 return QMI_CMD_REQUEST;
334 static void cmd_dms_get_imei_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg)
336 struct qmi_dms_get_ids_response res;
338 qmi_parse_dms_get_ids_response(msg, &res);
340 blobmsg_add_string(&status, NULL, res.data.imei);
343 static enum qmi_cmd_result
344 cmd_dms_get_imei_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
346 qmi_set_dms_get_ids_request(msg);
347 return QMI_CMD_REQUEST;
350 #define cmd_dms_reset_cb no_cb
351 static enum qmi_cmd_result
352 cmd_dms_reset_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
354 qmi_set_dms_reset_request(msg);
355 return QMI_CMD_REQUEST;
358 #define cmd_dms_set_operating_mode_cb no_cb
359 static enum qmi_cmd_result
360 cmd_dms_set_operating_mode_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg)
362 static const char *modes[] = {
363 [QMI_DMS_OPERATING_MODE_ONLINE] = "online",
364 [QMI_DMS_OPERATING_MODE_LOW_POWER] = "low_power",
365 [QMI_DMS_OPERATING_MODE_FACTORY_TEST] = "factory_test",
366 [QMI_DMS_OPERATING_MODE_OFFLINE] = "offline",
367 [QMI_DMS_OPERATING_MODE_RESET] = "reset",
368 [QMI_DMS_OPERATING_MODE_SHUTTING_DOWN] = "shutting_down",
369 [QMI_DMS_OPERATING_MODE_PERSISTENT_LOW_POWER] = "persistent_low_power",
370 [QMI_DMS_OPERATING_MODE_MODE_ONLY_LOW_POWER] = "mode_only_low_power",
372 static struct qmi_dms_set_operating_mode_request sreq = {
373 QMI_INIT(mode, QMI_DMS_OPERATING_MODE_ONLINE),
377 for (i = 0; i < ARRAY_SIZE(modes); i++) {
381 if (strcmp(arg, modes[i]) != 0)
385 qmi_set_dms_set_operating_mode_request(msg, &sreq);
386 return QMI_CMD_REQUEST;
389 return uqmi_add_error("Invalid argument");