diff options
author | Pavan Holla <pholla@chromium.org> | 2020-09-28 20:38:24 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-10-03 13:14:21 +0000 |
commit | aa4dce2afc804d6ba4670392919dd12dbc62a162 (patch) | |
tree | adb79f7f6a97451abd353072a3b278c9fc0d16c9 | |
parent | 72d8bae65b74000c7c6f24e5a6ccb303e3c67b30 (diff) |
broadband-modem-qmi: Use UIM service for querying facility locks
DMS_UIM messages have been deprecated, and have been replaced by
equivalent UIM messages. Use UIM_GET_CARD_STATUS while querying for facility
locks if dms_uim messages were found to be deprecated.
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 109 | ||||
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 8 | ||||
-rw-r--r-- | src/mm-modem-helpers-qmi.h | 2 | ||||
-rw-r--r-- | src/mm-sim-qmi.c | 2 |
4 files changed, 108 insertions, 13 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 5aa909b6..f0e75f20 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -705,7 +705,7 @@ unlock_required_uim_get_card_status_ready (QmiClientUim *client, if (!mm_qmi_uim_get_card_status_output_parse (self, output, &lock, - NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, &error)) { /* The device may report a SIM NOT INSERTED error if we're querying the * card status soon after power on. We'll let the Modem interface generic @@ -957,8 +957,8 @@ unlock_retries_uim_get_card_status_ready (QmiClientUim *client, if (!mm_qmi_uim_get_card_status_output_parse (self, output, NULL, - &pin1_retries, &puk1_retries, - &pin2_retries, &puk2_retries, + NULL, &pin1_retries, &puk1_retries, + NULL, &pin2_retries, &puk2_retries, &error)) { g_task_return_error (task, error); g_object_unref (task); @@ -1891,7 +1891,7 @@ typedef struct { MMModem3gppFacility locks; } LoadEnabledFacilityLocksContext; -static void get_next_facility_lock_status (GTask *task); +static void get_next_facility_lock_status_via_dms (GTask *task); static void load_enabled_facility_locks_context_free (LoadEnabledFacilityLocksContext *ctx) @@ -1917,6 +1917,80 @@ modem_3gpp_load_enabled_facility_locks_finish (MMIfaceModem3gpp *self, } static void +get_sim_lock_status_via_get_card_status_ready (QmiClientUim *client, + GAsyncResult *res, + GTask *task) +{ + MMBroadbandModemQmi *self; + LoadEnabledFacilityLocksContext *ctx; + QmiMessageUimGetCardStatusOutput *output; + GError *error = NULL; + MMModemLock lock = MM_MODEM_LOCK_UNKNOWN; + QmiUimPinState pin1_state; + QmiUimPinState pin2_state; + + self = g_task_get_source_object (task); + ctx = g_task_get_task_data (task); + + output = qmi_client_uim_get_card_status_finish (client, res, &error); + if (!output || + !qmi_message_uim_get_card_status_output_get_result (output, &error)) { + g_prefix_error (&error, "QMI operation failed: "); + g_task_return_error (task, error); + g_object_unref (task); + if (output) + qmi_message_uim_get_card_status_output_unref (output); + return; + } + + if (!mm_qmi_uim_get_card_status_output_parse (self, + output, + &lock, + &pin1_state, NULL, NULL, &pin2_state, NULL, NULL, + &error)) { + g_prefix_error (&error, "QMI operation failed: "); + g_task_return_error (task, error); + } else { + ctx->locks &= ~(MM_MODEM_3GPP_FACILITY_SIM); + ctx->locks &= ~(MM_MODEM_3GPP_FACILITY_FIXED_DIALING); + + if (pin1_state == QMI_UIM_PIN_STATE_ENABLED_VERIFIED || + pin1_state == QMI_UIM_PIN_STATE_ENABLED_NOT_VERIFIED || + pin1_state == QMI_UIM_PIN_STATE_BLOCKED) { + ctx->locks |= (MM_MODEM_3GPP_FACILITY_SIM); + } + if (pin2_state == QMI_UIM_PIN_STATE_ENABLED_VERIFIED || + pin2_state == QMI_UIM_PIN_STATE_ENABLED_NOT_VERIFIED || + pin2_state == QMI_UIM_PIN_STATE_BLOCKED) { + ctx->locks |= (MM_MODEM_3GPP_FACILITY_FIXED_DIALING); + } + + g_task_return_int (task, ctx->locks); + } + + qmi_message_uim_get_card_status_output_unref (output); + g_object_unref (task); +} + +static void +get_sim_lock_status_via_get_card_status (GTask *task) +{ + MMBroadbandModemQmi *self; + LoadEnabledFacilityLocksContext *ctx; + + self = g_task_get_source_object (task); + ctx = g_task_get_task_data (task); + + mm_obj_dbg (self, "Getting UIM card status to read pin lock state..."); + qmi_client_uim_get_card_status (QMI_CLIENT_UIM (ctx->client), + NULL, + 5, + NULL, + (GAsyncReadyCallback) get_sim_lock_status_via_get_card_status_ready, + task); +} + +static void get_sim_lock_status_via_pin_status_ready (QmiClientDms *client, GAsyncResult *res, GTask *task) @@ -2035,11 +2109,11 @@ dms_uim_get_ck_status_ready (QmiClientDms *client, /* And go on with the next one */ ctx->current++; - get_next_facility_lock_status (task); + get_next_facility_lock_status_via_dms (task); } static void -get_next_facility_lock_status (GTask *task) +get_next_facility_lock_status_via_dms (GTask *task) { LoadEnabledFacilityLocksContext *ctx; guint i; @@ -2085,10 +2159,17 @@ modem_3gpp_load_enabled_facility_locks (MMIfaceModem3gpp *self, GTask *task; QmiClient *client = NULL; - if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) - return; + if (!MM_BROADBAND_MODEM_QMI (self)->priv->dms_uim_deprecated) { + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) + return; + } else { + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_UIM, &client, + callback, user_data)) + return; + } ctx = g_new (LoadEnabledFacilityLocksContext, 1); ctx->client = g_object_ref (client); @@ -2105,7 +2186,13 @@ modem_3gpp_load_enabled_facility_locks (MMIfaceModem3gpp *self, task = g_task_new (self, NULL, callback, user_data); g_task_set_task_data (task, ctx, (GDestroyNotify)load_enabled_facility_locks_context_free); - get_next_facility_lock_status (task); + /* DMS uses get_ck_status and get_pin_status to probe facilities + * UIM Messages to get all facility locks are not open-source yet + * UIM uses get_card_status to probe only FACILITY_SIM and FACILITY_FIXED_DIALING */ + if (!MM_BROADBAND_MODEM_QMI (self)->priv->dms_uim_deprecated) + get_next_facility_lock_status_via_dms (task); + else + get_sim_lock_status_via_get_card_status (task); } /*****************************************************************************/ diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c index 5f5afb36..e9291a71 100644 --- a/src/mm-modem-helpers-qmi.c +++ b/src/mm-modem-helpers-qmi.c @@ -1798,8 +1798,10 @@ gboolean mm_qmi_uim_get_card_status_output_parse (gpointer log_object, QmiMessageUimGetCardStatusOutput *output, MMModemLock *o_lock, + QmiUimPinState *o_pin1_state, guint *o_pin1_retries, guint *o_puk1_retries, + QmiUimPinState *o_pin2_state, guint *o_pin2_retries, guint *o_puk2_retries, GError **error) @@ -1935,11 +1937,15 @@ mm_qmi_uim_get_card_status_output_parse (gpointer log_ return FALSE; } - /* Report retries if requested to do so */ + /* Report state and retries if requested to do so */ + if (o_pin1_state) + *o_pin1_state = app->pin1_state; if (o_pin1_retries) *o_pin1_retries = app->pin1_retries; if (o_puk1_retries) *o_puk1_retries = app->puk1_retries; + if (o_pin2_state) + *o_pin2_state = app->pin2_state; if (o_pin2_retries) *o_pin2_retries = app->pin2_retries; if (o_puk2_retries) diff --git a/src/mm-modem-helpers-qmi.h b/src/mm-modem-helpers-qmi.h index ae52afb8..baa993e0 100644 --- a/src/mm-modem-helpers-qmi.h +++ b/src/mm-modem-helpers-qmi.h @@ -160,8 +160,10 @@ GArray *mm_firmware_unique_id_to_qmi_unique_id (const gchar *unique_id, gboolean mm_qmi_uim_get_card_status_output_parse (gpointer log_object, QmiMessageUimGetCardStatusOutput *output, MMModemLock *o_lock, + QmiUimPinState *o_pin1_state, guint *o_pin1_retries, guint *o_puk1_retries, + QmiUimPinState *o_pin2_state, guint *o_pin2_retries, guint *o_puk2_retries, GError **error); diff --git a/src/mm-sim-qmi.c b/src/mm-sim-qmi.c index e0c7f2e5..52bf0792 100644 --- a/src/mm-sim-qmi.c +++ b/src/mm-sim-qmi.c @@ -144,7 +144,7 @@ uim_get_card_status_ready (QmiClientUim *client, output = qmi_client_uim_get_card_status_finish (client, res, &error); if (!output || !qmi_message_uim_get_card_status_output_get_result (output, &error) || - (!mm_qmi_uim_get_card_status_output_parse (self, output, NULL, NULL, NULL, NULL, NULL, &error) && + (!mm_qmi_uim_get_card_status_output_parse (self, output, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &error) && (g_error_matches (error, MM_MOBILE_EQUIPMENT_ERROR, MM_MOBILE_EQUIPMENT_ERROR_SIM_NOT_INSERTED) || g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_RETRY)))) { mm_obj_dbg (self, "sim not yet considered ready... retrying"); |