aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem-mbim.c
diff options
context:
space:
mode:
authorUjjwal Pande <ujjwalpande@google.com>2023-05-25 21:42:01 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2023-06-08 20:16:12 +0000
commite3a1206c57db685065dfd0eb4efae5083dd5cef5 (patch)
treebc0cb37666e9d7b798f0bf9f53c5558b340fa53f /src/mm-broadband-modem-mbim.c
parent97c32d6e51ebabb14085a7166db6d7c81d62e98e (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.c87
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