diff options
author | Ujjwal Pande <ujjwalpande@google.com> | 2023-05-25 21:42:01 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2023-06-08 20:16:12 +0000 |
commit | e3a1206c57db685065dfd0eb4efae5083dd5cef5 (patch) | |
tree | bc0cb37666e9d7b798f0bf9f53c5558b340fa53f /src/mm-broadband-modem-mbim.c | |
parent | 97c32d6e51ebabb14085a7166db6d7c81d62e98e (diff) |
api: new carrier lock support
Adding support for carrier lock for MBIM modems using google simlock
mechanism.
Diffstat (limited to 'src/mm-broadband-modem-mbim.c')
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 6abeb541..48a235a9 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -145,6 +145,7 @@ struct _MMBroadbandModemMbimPrivate { gboolean is_intel_reset_supported; gboolean is_slot_info_status_supported; gboolean is_ms_sar_supported; + gboolean is_google_carrier_lock_supported; /* Process unsolicited notifications */ guint notification_id; @@ -3386,6 +3387,16 @@ query_device_services_ready (MbimDevice *device, continue; } + if (service == MBIM_SERVICE_GOOGLE) { + for (j = 0; j < device_services[i]->cids_count; j++) { + if (device_services[i]->cids[j] == MBIM_CID_GOOGLE_CARRIER_LOCK) { + mm_obj_dbg (self, "Google carrier lock is supported"); + self->priv->is_google_carrier_lock_supported = TRUE; + } + } + continue; + } + /* no optional features to check in remaining services */ } mbim_device_service_element_array_free (device_services); @@ -5121,6 +5132,14 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self, active_sim_event = TRUE; } + if ((self->priv->enabled_cache.last_ready_state != MBIM_SUBSCRIBER_READY_STATE_DEVICE_LOCKED && + ready_state == MBIM_SUBSCRIBER_READY_STATE_DEVICE_LOCKED) || + (self->priv->enabled_cache.last_ready_state == MBIM_SUBSCRIBER_READY_STATE_DEVICE_LOCKED && + ready_state != MBIM_SUBSCRIBER_READY_STATE_DEVICE_LOCKED)) { + mm_obj_dbg (self, "Lock state change detected"); + active_sim_event = TRUE; + } + self->priv->enabled_cache.last_ready_state = ready_state; if (active_sim_event) { @@ -9618,6 +9637,71 @@ set_packet_service_state (MMIfaceModem3gpp *self, task); } +/*****************************************************************************/ +/* Set carrier lock */ + +static gboolean +modem_set_carrier_lock_finish (MMIfaceModem3gpp *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +set_carrier_lock_ready (MbimDevice *device, + GAsyncResult *res, + GTask *task) +{ + g_autoptr(MbimMessage) response = NULL; + 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_boolean (task, TRUE); + } else if (g_error_matches (error, MBIM_STATUS_ERROR, MBIM_STATUS_ERROR_OPERATION_NOT_ALLOWED)) { + g_clear_error (&error); + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, "operation not allowed"); + } else + g_task_return_error (task, error); + + g_object_unref (task); +} + +static void +modem_set_carrier_lock (MMIfaceModem3gpp *_self, + const guint8 *data, + gsize data_size, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self); + MbimDevice *device; + g_autoptr(MbimMessage) message = NULL; + GTask *task; + + if (!peek_device (self, &device, callback, user_data)) + return; + + task = g_task_new (self, NULL, callback, user_data); + + if (!self->priv->is_google_carrier_lock_supported) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, + "Google carrier lock is not supported"); + g_object_unref (task); + return; + } + + mm_obj_dbg (self, "Sending carrier lock request..."); + message = mbim_message_google_carrier_lock_set_new (data_size, data, NULL); + mbim_device_command (device, + message, + 10, + NULL, + (GAsyncReadyCallback)set_carrier_lock_ready, + task); +} /*****************************************************************************/ @@ -9853,6 +9937,9 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->disable_facility_lock_finish = modem_3gpp_disable_facility_lock_finish; iface->set_packet_service_state = set_packet_service_state; iface->set_packet_service_state_finish = set_packet_service_state_finish; + /* carrier lock */ + iface->set_carrier_lock = modem_set_carrier_lock; + iface->set_carrier_lock_finish = modem_set_carrier_lock_finish; } static void |