aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichal Mazur <mkm@semihalf.com>2021-02-26 22:58:26 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-04-30 18:40:29 +0000
commit7f425d9b150f584de1e7d06a5f52a554caf78c6a (patch)
treec2175c22740f710214acf73a492248079ee4cdab /src
parente8edcedc9e80332a8dc862113acb05f8ed57b987 (diff)
broadband-modem: support disabling facility lock on MBIM and QMI modems
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-mbim.c95
-rw-r--r--src/mm-broadband-modem-qmi.c85
2 files changed, 180 insertions, 0 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 6439e225..1592c4ec 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -2765,6 +2765,99 @@ modem_3gpp_load_enabled_facility_locks (MMIfaceModem3gpp *self,
}
/*****************************************************************************/
+/* Facility locks disabling (3GPP interface) */
+
+static gboolean
+modem_3gpp_disable_facility_lock_finish (MMIfaceModem3gpp *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+disable_facility_lock_ready (MbimDevice *device,
+ GAsyncResult *res,
+ GTask *task)
+{
+ MbimMessage *response = NULL;
+ guint32 remaining_attempts;
+ MbimPinState pin_state;
+ MbimPinType pin_type;
+ GError *error = NULL;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (!response || !mbim_message_response_get_result (response,
+ MBIM_MESSAGE_TYPE_COMMAND_DONE,
+ &error)) {
+ g_task_return_error (task, error);
+ } else if (!mbim_message_pin_response_parse (response,
+ &pin_type,
+ &pin_state,
+ &remaining_attempts,
+ &error)) {
+ g_task_return_error (task, error);
+ } else if (pin_state == MBIM_PIN_STATE_LOCKED) {
+ g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Disabling PIN lock %s failed, remaining attempts: %u",
+ mbim_pin_state_get_string (pin_state),
+ remaining_attempts);
+ } else
+ g_task_return_boolean (task, TRUE);
+
+ if (response)
+ mbim_message_unref (response);
+ g_object_unref (task);
+}
+
+static void
+modem_3gpp_disable_facility_lock (MMIfaceModem3gpp *self,
+ MMModem3gppFacility facility,
+ guint8 slot,
+ const gchar *key,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ MbimMessage *message;
+ MbimPinType pin_type;
+ MbimDevice *device;
+ GTask *task;
+
+ if (!peek_device (self, &device, callback, user_data))
+ return;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ /* Set type of pin lock to disable */
+ pin_type = mbim_pin_type_from_mm_modem_3gpp_facility (facility);
+ if (pin_type == MBIM_PIN_TYPE_UNKNOWN) {
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS,
+ "Not supported type of facility lock.");
+ g_object_unref (task);
+ return;
+ }
+
+ mm_obj_dbg (self, "Trying to disable %s lock using key: %s",
+ mbim_pin_type_get_string (pin_type), key);
+
+ message = mbim_message_pin_set_new (pin_type,
+ MBIM_PIN_OPERATION_DISABLE,
+ key,
+ NULL,
+ NULL);
+
+ mbim_device_command (device,
+ message,
+ 10,
+ NULL,
+ (GAsyncReadyCallback)disable_facility_lock_ready,
+ task);
+ mbim_message_unref (message);
+}
+
+/*****************************************************************************/
/* Initial EPS bearer info loading */
static MMBearerProperties *
@@ -6360,6 +6453,8 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
iface->register_in_network_finish = modem_3gpp_register_in_network_finish;
iface->scan_networks = modem_3gpp_scan_networks;
iface->scan_networks_finish = modem_3gpp_scan_networks_finish;
+ iface->disable_facility_lock = modem_3gpp_disable_facility_lock;
+ iface->disable_facility_lock_finish = modem_3gpp_disable_facility_lock_finish;
}
static void
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 18d1de80..aaffe2c6 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -2444,6 +2444,89 @@ modem_3gpp_load_enabled_facility_locks (MMIfaceModem3gpp *self,
}
/*****************************************************************************/
+/* Facility locks disabling (3GPP interface) */
+
+static gboolean
+modem_3gpp_disable_facility_lock_finish (MMIfaceModem3gpp *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+disable_facility_lock_ready (QmiClientUim *client,
+ GAsyncResult *res,
+ GTask *task)
+{
+ QmiMessageUimDepersonalizationOutput *output;
+ GError *error = NULL;
+
+ output = qmi_client_uim_depersonalization_finish (client, res, &error);
+ if (!output ||
+ !qmi_message_uim_depersonalization_output_get_result (output, &error)) {
+ g_prefix_error (&error, "QMI message Depersonalization failed: ");
+ g_task_return_error (task, error);
+ } else {
+ g_task_return_boolean (task, TRUE);
+ }
+
+ if (output)
+ qmi_message_uim_depersonalization_output_unref (output);
+ g_object_unref (task);
+}
+
+static void
+modem_3gpp_disable_facility_lock (MMIfaceModem3gpp *self,
+ MMModem3gppFacility facility,
+ guint8 slot,
+ const gchar *key,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ QmiUimCardApplicationPersonalizationFeature feature;
+ QmiMessageUimDepersonalizationInput *input;
+ QmiClient *client = NULL;
+ GTask *task;
+
+ if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
+ QMI_SERVICE_UIM, &client,
+ callback, user_data))
+ return;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ /* Choose facility to disable */
+ feature = qmi_personalization_feature_from_mm_modem_3gpp_facility (facility);
+ if (feature == QMI_UIM_CARD_APPLICATION_PERSONALIZATION_FEATURE_UNKNOWN) {
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS,
+ "Not supported type of facility lock.");
+ g_object_unref (task);
+ return;
+ }
+
+ mm_obj_dbg (self, "Trying to disable %s lock on slot %d using key: %s",
+ qmi_uim_card_application_personalization_feature_get_string (feature),
+ slot, key);
+
+ input = qmi_message_uim_depersonalization_input_new ();
+ qmi_message_uim_depersonalization_input_set_info (input,
+ feature,
+ QMI_UIM_DEPERSONALIZATION_OPERATION_DEACTIVATE,
+ key,
+ NULL);
+ qmi_message_uim_depersonalization_input_set_slot (input, slot, NULL);
+
+ qmi_client_uim_depersonalization (QMI_CLIENT_UIM (client),
+ input,
+ 30,
+ NULL,
+ (GAsyncReadyCallback) disable_facility_lock_ready,
+ task);
+ qmi_message_uim_depersonalization_input_unref (input);
+}
+
+/*****************************************************************************/
/* Scan networks (3GPP interface) */
static GList *
@@ -11231,6 +11314,8 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
iface->load_initial_eps_bearer_settings_finish = modem_3gpp_load_initial_eps_bearer_settings_finish;
iface->set_initial_eps_bearer_settings = modem_3gpp_set_initial_eps_bearer_settings;
iface->set_initial_eps_bearer_settings_finish = modem_3gpp_set_initial_eps_bearer_settings_finish;
+ iface->disable_facility_lock = modem_3gpp_disable_facility_lock;
+ iface->disable_facility_lock_finish = modem_3gpp_disable_facility_lock_finish;
}
static void