4 * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
28 #include <core_object.h>
36 #include "imc_modem.h"
37 #include "imc_common.h"
40 static gboolean on_event_imc_nvm_update(CoreObject *co,
41 const void *event_info, void *user_data);
43 /* NVM Req/Response */
44 static gboolean __imc_modem_check_nvm_response(const void *data, int command)
46 const TcoreAtResponse *at_resp = data;
49 GSList *tokens = NULL;
54 /* +XDRV: <group_id>,<function_id>,<xdrv_result>[,<response_n>] */
55 if (NULL == at_resp) {
56 err("Input data is NULL");
60 if (at_resp->success > 0) {
62 line = (const char *) (((GSList *) at_resp->lines)->data);
63 tokens = tcore_at_tok_new(line);
66 resp_str = g_slist_nth_data(tokens, 0);
67 if (NULL == resp_str) {
68 err("Group ID is missing ");
71 else if (IUFP_GROUP_ID != atoi(resp_str)) {
72 err("Group ID mismatch");
77 resp_str = g_slist_nth_data(tokens, 1);
78 if (NULL == resp_str) {
79 err("Function ID is missing ");
82 else if (command != atoi(resp_str)) {
83 err("Function ID mismatch");
88 resp_str = g_slist_nth_data(tokens, 2);
89 if (NULL == resp_str) {
90 err("XDRV result is missing ");
93 else if (XDRV_RESULT_OK != atoi(resp_str)) {
94 err("XDRV result[%d] ", atoi(resp_str));
99 resp_str = g_slist_nth_data(tokens, 3);
100 if (NULL == resp_str) {
101 err("UTA result is missing ");
104 else if (UTA_SUCCESS != atoi(resp_str)) {
105 err("uta result[%d] ", atoi(resp_str));
115 tcore_at_tok_free(tokens);
121 static void __on_response_modem_unsuspend_nvm_updates(TcorePending *p,
122 guint data_len, const void *data, void *user_data)
124 /* Check NVM response */
125 if (TRUE == __imc_modem_check_nvm_response(data, IUFP_SUSPEND)) {
126 dbg("Priority level is set to get all updates since Boot-up");
128 /* Create NV data file */
129 if (nvm_create_nvm_data() == FALSE) {
130 err("Failed to Create NV data file");
136 err("Response NOT OK");
139 static void __imc_modem_unsuspend_nvm_updates(CoreObject *co)
144 /* Prepare AT-Command */
145 cmd_str = g_strdup_printf("AT+XDRV=%d, %d, %d, %d",
146 IUFP_GROUP_ID, IUFP_SUSPEND,
147 0, UTA_FLASH_PLUGIN_PRIO_UNSUSPEND_ALL);
149 /* Send Request to modem */
150 ret = tcore_at_prepare_and_send_request(co,
152 TCORE_AT_COMMAND_TYPE_SINGLELINE,
153 TCORE_PENDING_PRIORITY_DEFAULT,
155 __on_response_modem_unsuspend_nvm_updates, NULL,
156 on_send_imc_request, NULL,
159 IMC_CHECK_REQUEST_RET(ret, NULL, "Unsuspend Nvm Updates");
164 static void __on_response_modem_send_nvm_update_ack(TcorePending *p,
165 guint data_len, const void *data, void *user_data)
167 /* Check NVM response */
168 if (TRUE == __imc_modem_check_nvm_response(data, IUFP_UPDATE_ACK)) {
169 dbg("[UPDATE ACK] OK");
173 err("[UPDATE ACK] NOT OK");
176 static void __imc_modem_send_nvm_update_ack(CoreObject *co)
181 /* Prepare AT-Command */
182 cmd_str = g_strdup_printf("AT+XDRV=%s, %s", IUFP_GROUP, IUFP_UPDATE_ACK_STR);
184 /* Send Request to modem */
185 ret = tcore_at_prepare_and_send_request(co,
187 TCORE_AT_COMMAND_TYPE_SINGLELINE,
188 TCORE_PENDING_PRIORITY_DEFAULT,
190 __on_response_modem_send_nvm_update_ack, NULL,
191 on_send_imc_request, NULL,
194 IMC_CHECK_REQUEST_RET(ret, NULL, "Nvm Update Ack");
199 static void __on_response_modem_send_nvm_update_request_ack(TcorePending *p,
200 guint data_len, const void *data, void *user_data)
202 /* Check NVM response */
203 if (TRUE == __imc_modem_check_nvm_response(data, IUFP_UPDATE_REQ_ACK)) {
204 dbg("[REQUEST ACK] OK");
208 err("[REQUEST ACK] NOT OK");
211 static void __imc_modem_send_nvm_update_request_ack(CoreObject *co)
216 /* Prepare AT-Command */
217 cmd_str = g_strdup_printf("AT+XDRV=%s, %s", IUFP_GROUP, IUFP_UPDATE_REQ_ACK_STR);
219 /* Send Request to modem */
220 ret = tcore_at_prepare_and_send_request(co,
222 TCORE_AT_COMMAND_TYPE_SINGLELINE,
223 TCORE_PENDING_PRIORITY_DEFAULT,
225 __on_response_modem_send_nvm_update_request_ack, NULL,
226 on_send_imc_request, NULL,
229 IMC_CHECK_REQUEST_RET(ret, NULL, "Nvm Update Request Ack");
234 static void __on_response_modem_register_nvm(TcorePending *p,
235 guint data_len, const void *data, void *user_data)
237 /* Check NVM response */
238 if (TRUE == __imc_modem_check_nvm_response(data, IUFP_REGISTER)) {
239 dbg("Registering successful");
241 /* Send SUSPEND_UPDATE for all UPDATES */
242 __imc_modem_unsuspend_nvm_updates(tcore_pending_ref_core_object(p));
248 err("Response NOT OK");
251 /* System function responses */
252 static void on_response_modem_set_flight_mode_internal(TcorePlugin *plugin,
253 gint result, const void *response, void *user_data)
256 gboolean flight_mode;
259 co = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_MODEM);
260 tcore_check_return_assert(co != NULL);
262 tcore_check_return(result == TEL_MODEM_RESULT_SUCCESS);
264 /* Get Flight mode state */
265 (void)tcore_modem_get_flight_mode_state(co, &flight_mode);
267 dbg("Setting Modem Fiight mode (internal) - [%s] - [SUCCESS]",
268 (flight_mode ? "ON": "OFF"));
273 * This is an internal request to set Flight mode, which is sent during
274 * boot-up based on AP-side configuration (VCONF).
276 * Need to notify TAPI through Notiifcation -
277 * TCORE_NOTIFICATION_MODEM_FLIGHT_MODE
279 (void)tcore_object_send_notification(co,
280 TCORE_NOTIFICATION_MODEM_FLIGHT_MODE,
281 sizeof(gboolean), &flight_mode);
284 /* System functions */
285 gboolean imc_modem_power_on_modem(TcorePlugin *plugin)
289 gboolean flight_mode;
290 TelModemPowerStatus power_status;
292 co = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_MODEM);
293 tcore_check_return_value_assert(co != NULL, FALSE);
295 /* Set Modem Power State to 'ON' */
296 tcore_modem_set_powered(co, TRUE);
299 * Set Flight mode (as per AP settings -VCONF)
301 /* Get Flight mode from VCONFKEY */
302 strg = tcore_server_find_storage(tcore_plugin_ref_server(plugin), "vconf");
303 tcore_check_return_value_assert(strg != NULL, FALSE);
305 flight_mode = tcore_storage_get_bool(strg, STORAGE_KEY_FLIGHT_MODE);
308 * Set Flight mode request is dispatched to Core Object (Modem)
309 * to ensure that 'Request Hooks' get executed.
311 (void)tcore_object_dispatch_request(co, TRUE,
312 TCORE_COMMAND_MODEM_SET_FLIGHTMODE,
313 &flight_mode, sizeof(gboolean),
314 on_response_modem_set_flight_mode_internal, NULL);
319 * Need to notify Modem is Powered UP through Notiifcation -
320 * TCORE_NOTIFICATION_MODEM_POWER
322 power_status = TEL_MODEM_POWER_ON;
323 (void)tcore_object_send_notification(co,
324 TCORE_NOTIFICATION_MODEM_POWER,
325 sizeof(TelModemPowerStatus), &power_status);
330 /* Modem Responses */
331 static void on_response_imc_modem_set_power_status(TcorePending *p,
332 guint data_len, const void *data, void *user_data)
334 const TcoreAtResponse *at_resp = data;
335 CoreObject *co = tcore_pending_ref_core_object(p);
336 ImcRespCbData *resp_cb_data = user_data;
337 TelModemPowerStatus *status;
338 gboolean powered = FALSE;
340 TelModemResult result = TEL_MODEM_RESULT_FAILURE;
343 tcore_check_return_assert(co != NULL);
344 tcore_check_return_assert(resp_cb_data != NULL);
346 if (at_resp && at_resp->success)
347 result = TEL_MODEM_RESULT_SUCCESS;
349 status = (TelModemPowerStatus *)
350 IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
352 /* Update Core Object */
354 case TEL_MODEM_POWER_ON:
355 dbg("Setting Modem Power status [ON] - [%s]",
356 (result == TEL_MODEM_RESULT_SUCCESS ? "SUCCESS" : "FAIL"));
359 case TEL_MODEM_POWER_OFF:
360 dbg("Setting Modem Power status [OFF] - [%s]",
361 (result == TEL_MODEM_RESULT_SUCCESS ? "SUCCESS" : "FAIL"));
365 warn("Unexpected - Setting Modem Power status [RESET] - [%s]",
366 (result == TEL_MODEM_RESULT_SUCCESS ? "SUCCESS" : "FAIL"));
369 tcore_modem_set_powered(co, powered);
371 /* Invoke callback */
372 if (resp_cb_data->cb)
373 resp_cb_data->cb(co, (gint)result, NULL, resp_cb_data->cb_data);
375 /* Free callback data */
376 imc_destroy_resp_cb_data(resp_cb_data);
379 static void on_response_imc_modem_set_flight_mode(TcorePending *p,
380 guint data_len, const void *data, void *user_data)
382 const TcoreAtResponse *at_resp = data;
383 CoreObject *co = tcore_pending_ref_core_object(p);
384 ImcRespCbData *resp_cb_data = user_data;
387 TelModemResult result = TEL_MODEM_RESULT_FAILURE;
390 tcore_check_return_assert(co != NULL);
391 tcore_check_return_assert(resp_cb_data != NULL);
393 if (at_resp && at_resp->success)
394 result = TEL_MODEM_RESULT_SUCCESS;
396 enable = (gboolean *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
398 dbg("Setting Modem Fiight mode - [%s] - [%s]",
399 (*enable ? "ON": "OFF"),
400 (result == TEL_MODEM_RESULT_SUCCESS ? "SUCCESS" : "FAIL"));
402 /* Update Core Object */
403 (void)tcore_modem_set_flight_mode_state(co, *enable);
405 /* Invoke callback */
406 if (resp_cb_data->cb)
407 resp_cb_data->cb(co, (gint)result, NULL, resp_cb_data->cb_data);
409 /* Free callback data */
410 imc_destroy_resp_cb_data(resp_cb_data);
413 * In case Flight mode is set to OFF, we need to trigger
414 * Network Registration.
416 * This is taken care by Network module which hooks on
417 * Set Flight mode Request of Modem module.
421 /* Current modem does not support this operation */
423 static void on_response_imc_modem_get_version(TcorePending *p,
424 guint data_len, const void *data, void *user_data)
426 const TcoreAtResponse *at_resp = data;
427 CoreObject *co = tcore_pending_ref_core_object(p);
428 ImcRespCbData *resp_cb_data = user_data;
429 TelModemVersion version = {{0}, {0}, {0}, {0}};
431 TelModemResult result = TEL_MODEM_RESULT_FAILURE;
434 tcore_check_return_assert(co != NULL);
435 tcore_check_return_assert(resp_cb_data != NULL);
438 if (at_resp->lines) {
440 GSList *tokens = NULL;
442 line = (const gchar *)at_resp->lines->data;
443 tokens = tcore_at_tok_new(line);
444 if (g_slist_length(tokens) > 0) {
445 if (at_resp->success) {
446 gchar *sw_ver = NULL, *hw_ver = NULL;
447 gchar *calib_date = NULL, *p_code = NULL;
449 sw_ver = g_slist_nth_data(tokens, 0);
450 hw_ver = g_slist_nth_data(tokens, 1);
451 calib_date = g_slist_nth_data(tokens, 2);
452 p_code = g_slist_nth_data(tokens, 3);
454 g_strlcpy(version.software_version,
456 TEL_MODEM_VERSION_LENGTH_MAX + 1);
459 g_strlcpy(version.hardware_version,
461 TEL_MODEM_VERSION_LENGTH_MAX + 1);
463 if (calib_date != NULL){
464 g_strlcpy(version.calibration_date,
466 TEL_MODEM_VERSION_LENGTH_MAX + 1);
469 g_strlcpy(version.product_code,
471 TEL_MODEM_VERSION_LENGTH_MAX + 1);
473 dbg("Version - Software: [%s] Hardware: [%s] "
474 "Calibration date: [%s] Product "
475 "Code: [%s]", sw_ver, hw_ver,
478 result = TEL_MODEM_RESULT_SUCCESS;
480 err("RESPONSE - [NOK]");
481 err("[%s]", g_slist_nth_data(tokens, 0));
484 err("Invalid response message");
485 result = TEL_MODEM_RESULT_UNKNOWN_FAILURE;
487 tcore_at_tok_free(tokens);
491 /* Invoke callback */
492 if (resp_cb_data->cb)
493 resp_cb_data->cb(co, (gint)result, &version, resp_cb_data->cb_data);
495 /* Free callback data */
496 imc_destroy_resp_cb_data(resp_cb_data);
500 static void on_response_imc_modem_get_imei(TcorePending *p,
501 guint data_len, const void *data, void *user_data)
503 const TcoreAtResponse *at_resp = data;
504 CoreObject *co = tcore_pending_ref_core_object(p);
505 ImcRespCbData *resp_cb_data = user_data;
506 gchar imei[TEL_MODEM_IMEI_LENGTH_MAX +1] = {0};
508 TelModemResult result = TEL_MODEM_RESULT_FAILURE;
511 tcore_check_return_assert(co != NULL);
512 tcore_check_return_assert(resp_cb_data != NULL);
515 if (at_resp->lines) {
517 GSList *tokens = NULL;
519 line = (const gchar *)at_resp->lines->data;
520 tokens = tcore_at_tok_new(line);
521 if (g_slist_length(tokens) == 1) {
522 if (at_resp->success) {
523 dbg("RESPONSE - [OK]");
525 (const gchar *)g_slist_nth_data(tokens, 0),
526 TEL_MODEM_IMEI_LENGTH_MAX+1);
527 dbg("IMEI: [%s]", imei);
529 result = TEL_MODEM_RESULT_SUCCESS;
531 err("RESPONSE - [NOK]");
532 err("[%s]", g_slist_nth_data(tokens, 0));
535 err("Invalid response message");
536 result = TEL_MODEM_RESULT_UNKNOWN_FAILURE;
538 tcore_at_tok_free(tokens);
542 /* Invoke callback */
543 if (resp_cb_data->cb)
544 resp_cb_data->cb(co, (gint)result, imei, resp_cb_data->cb_data);
546 /* Free callback data */
547 imc_destroy_resp_cb_data(resp_cb_data);
550 /* Modem Operations */
552 * Operation - set_power_status
555 * AT-Command: AT+CFUN=<fun>
558 * 0 Mode to switch off MS
559 * ... Other modes are available for other oprations
562 * Success: (No Result)
565 * +CME ERROR: <error>
567 static TelReturn imc_modem_set_power_status(CoreObject *co,
568 TelModemPowerStatus status,
569 TcoreObjectResponseCallback cb, void *cb_data)
574 ImcRespCbData *resp_cb_data;
577 if (status == TEL_MODEM_POWER_ON) {
578 warn("Modem Power ON - Not supported by CP");
579 return TEL_RETURN_OPERATION_NOT_SUPPORTED;
580 } else if (status == TEL_MODEM_POWER_ERROR) {
581 err("Modem Power ERROR - Invalid mode");
582 return TEL_RETURN_INVALID_PARAMETER;
584 dbg("Modem Power OFF");
589 at_cmd = g_strdup_printf("AT+CFUN=%d", power_mode);
591 /* Response callback data */
592 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
593 &status, sizeof(TelModemPowerStatus));
595 /* Send Request to modem */
596 ret = tcore_at_prepare_and_send_request(co,
598 TCORE_AT_COMMAND_TYPE_NO_RESULT,
599 TCORE_PENDING_PRIORITY_DEFAULT,
601 on_response_imc_modem_set_power_status, resp_cb_data,
602 on_send_imc_request, NULL,
604 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Set Power Status");
613 * Operation - set_flight_mode
616 * AT-Command: AT+CFUN=<fun>
619 * 0 Mode to switch off MS
620 * 1 Full functionality
621 * 4 Mode to disable phone both transmit and receive
622 * RF circuits. Airplane mode.
623 * ... Other modes are available for other oprations
626 * Success: (No Result)
629 * +CME ERROR: <error>
631 static TelReturn imc_modem_set_flight_mode(CoreObject *co, gboolean enable,
632 TcoreObjectResponseCallback cb, void *cb_data)
637 ImcRespCbData *resp_cb_data;
641 dbg("Flight mode - [ON]");
644 dbg("Flight mode - [OFF]");
649 at_cmd = g_strdup_printf("AT+CFUN=%d", power_mode);
651 /* Response callback data */
652 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
653 &enable, sizeof(gboolean));
655 /* Send Request to modem */
656 ret = tcore_at_prepare_and_send_request(co,
658 TCORE_AT_COMMAND_TYPE_NO_RESULT,
659 TCORE_PENDING_PRIORITY_DEFAULT,
661 on_response_imc_modem_set_flight_mode, resp_cb_data,
662 on_send_imc_request, NULL,
664 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Set Flight mode");
673 * Operation - get_flight_mode
677 * Fetch information from Core Object
679 * Response - flight_mode (gboolean)
681 static TelReturn imc_modem_get_flight_mode(CoreObject *co,
682 TcoreObjectResponseCallback cb, void *cb_data)
684 gboolean flight_mode;
686 /* Fetch Flight mode from Core Object */
687 (void)tcore_modem_get_flight_mode_state(co, &flight_mode);
688 dbg("Modem Flight mode - [%s]", (flight_mode ? "ON": "OFF"));
690 /* Invoke response callback */
692 cb(co, (gint)TEL_MODEM_RESULT_SUCCESS, &flight_mode, cb_data);
694 return TEL_RETURN_SUCCESS;
698 * Operation - get_version
701 * AT-Command: AT+CGMR
703 * Response - version (TelModemVersion)
704 * Success: (Single line) -
705 * <sw_ver>, <hw_ver>, <calib_date>, <p_code>
708 * Success Response is different from standard 3GPP AT-Command (+CGMR)
710 * +CME ERROR: <error>
712 static TelReturn imc_modem_get_version(CoreObject *co,
713 TcoreObjectResponseCallback cb, void *cb_data)
717 /* Current modem does not support this operation */
719 ImcRespCbData *resp_cb_data;
722 /* Response callback data */
723 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
726 /* Send Request to modem */
727 ret = tcore_at_prepare_and_send_request(co,
729 TCORE_AT_COMMAND_TYPE_SINGLELINE,
730 TCORE_PENDING_PRIORITY_DEFAULT,
732 on_response_imc_modem_get_version, resp_cb_data,
733 on_send_imc_request, NULL,
735 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get Version");
741 return TEL_RETURN_OPERATION_NOT_SUPPORTED;
745 * Operation - get_imei
748 * AT-Command: AT+CGSN
750 * Response - imei (gchar array of length 20+'\0' bytes)
751 * Success: (Single line)
755 * +CME ERROR: <error>
757 static TelReturn imc_modem_get_imei(CoreObject *co,
758 TcoreObjectResponseCallback cb, void *cb_data)
760 ImcRespCbData *resp_cb_data;
765 /* Response callback data */
766 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
769 /* Send Request to modem */
770 ret = tcore_at_prepare_and_send_request(co,
772 TCORE_AT_COMMAND_TYPE_NUMERIC,
773 TCORE_PENDING_PRIORITY_DEFAULT,
775 on_response_imc_modem_get_imei, resp_cb_data,
776 on_send_imc_request, NULL,
778 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get IMEI");
783 /* Modem Operations */
784 static TcoreModemOps imc_modem_ops = {
785 .set_power_status = imc_modem_set_power_status,
786 .set_flight_mode = imc_modem_set_flight_mode,
787 .get_flight_mode = imc_modem_get_flight_mode,
788 .get_version = imc_modem_get_version,
789 .get_imei = imc_modem_get_imei
792 gboolean imc_modem_init(TcorePlugin *p, CoreObject *co)
797 tcore_modem_set_ops(co, &imc_modem_ops);
800 tcore_object_add_callback(co, "+XDRVI:", on_event_imc_nvm_update, NULL);
806 void imc_modem_exit(TcorePlugin *p, CoreObject *co)
812 * NV Manager - Support for Remote File System
815 static gboolean __imc_nvm_modem_rfs_hook(const char *data)
818 if (data[NVM_FUNCTION_ID_OFFSET] == XDRV_INDICATION)
825 gboolean on_event_imc_nvm_update(CoreObject *co,
826 const void *event_info, void *user_data)
828 GSList *tokens = NULL;
836 lines = (GSList *)event_info;
838 dbg("Line: [%s]", line);
840 function_id = nvm_sum_4_bytes(&line[NVM_FUNCTION_ID_OFFSET]);
841 dbg("Function ID: [%d]", function_id);
842 if (IUFP_UPDATE == function_id) {
843 dbg("Calling process nvm_update");
846 * Process NV Update indication
848 * +XDRVI: IUFP_GROUP, IUFP_UPDATE, <xdrv_result>, <data>
850 if (NVM_NO_ERR == nvm_process_nv_update(line)) {
851 dbg("NV data processed successfully");
853 /* Acknowledge NV Update */
854 __imc_modem_send_nvm_update_ack(co);
858 err("NV data processing failed");
862 tokens = tcore_at_tok_new(line);
863 if (g_slist_length(tokens) < 3) {
864 err("XDRVI event with less number of tokens, Ignore!!!");
867 else if (IUFP_GROUP_ID != atoi(g_slist_nth_data(tokens, 0))) {
868 err("Group ID mismatch, Ignore!!!");
872 switch (atoi(g_slist_nth_data(tokens, 1))) {
873 case IUFP_UPDATE_REQ:
874 dbg("NV Update Request");
876 /* Acknowledge the Update Request */
877 __imc_modem_send_nvm_update_request_ack(co);
880 case IUFP_NO_PENDING_UPDATE:
881 dbg("NO pending NV Update(s)!!!");
882 /* Can send FLUSH request to get fresh updates */
886 err("Unspported Function ID [%d], Ignore", atoi(g_slist_nth_data(tokens, 1)));
891 tcore_at_tok_free(tokens);
899 void imc_modem_register_nvm(CoreObject *co)
904 /* Prepare AT-Command */
905 cmd_str = g_strdup_printf("AT+XDRV=%s, %s, %s",
906 IUFP_GROUP, IUFP_REGISTER_STR, XDRV_ENABLE);
908 /* Send Request to modem */
909 ret = tcore_at_prepare_and_send_request(co,
911 TCORE_AT_COMMAND_TYPE_SINGLELINE,
912 TCORE_PENDING_PRIORITY_DEFAULT,
914 __on_response_modem_register_nvm, NULL,
915 on_send_imc_request, NULL,
917 if (ret != TEL_RETURN_SUCCESS) {
918 err("Failed to process request - [Register NVM]");
922 dbg("Adding NVM hook");
923 tcore_at_add_hook(tcore_object_get_hal(co), __imc_nvm_modem_rfs_hook);