aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2018-08-09 10:45:48 +0200
committerDan Williams <dcbw@redhat.com>2018-08-10 04:26:12 +0000
commit7a941466c29342b1ebb30fbd54f41f4f7005d0b0 (patch)
tree63d5bc0e6d6ea6500e533975b321f2803d988c00
parentff6a82f5b754366db042cc602e1ffbbf46682749 (diff)
broadband-modem-mbim: implement 3GPP location support with ATDS
-rw-r--r--src/mm-broadband-modem-mbim.c119
1 files changed, 86 insertions, 33 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 431fda71..062cf21d 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -81,6 +81,7 @@ struct _MMBroadbandModemMbimPrivate {
/* Supported features */
gboolean is_pco_supported;
gboolean is_ussd_supported;
+ gboolean is_atds_location_supported;
/* Process unsolicited notifications */
guint notification_id;
@@ -1791,6 +1792,15 @@ query_device_services_ready (MbimDevice *device,
}
}
break;
+ case MBIM_SERVICE_ATDS:
+ for (j = 0; j < device_services[i]->cids_count; j++) {
+ if (device_services[i]->cids[j] == MBIM_CID_ATDS_LOCATION) {
+ mm_dbg ("ATDS location is supported");
+ self->priv->is_atds_location_supported = TRUE;
+ break;
+ }
+ }
+ break;
default:
break;
}
@@ -3046,29 +3056,56 @@ modem_3gpp_load_operator_code (MMIfaceModem3gpp *_self,
/* Registration checks (3GPP interface) */
static gboolean
-modem_3gpp_run_registration_checks_finish (MMIfaceModem3gpp *self,
- GAsyncResult *res,
- GError **error)
+modem_3gpp_run_registration_checks_finish (MMIfaceModem3gpp *self,
+ GAsyncResult *res,
+ GError **error)
{
return g_task_propagate_boolean (G_TASK (res), error);
}
static void
-register_state_query_ready (MbimDevice *device,
+atds_location_query_ready (MbimDevice *device,
+ GAsyncResult *res,
+ GTask *task)
+{
+ MMBroadbandModemMbim *self;
+ MbimMessage *response;
+ GError *error = NULL;
+ guint32 lac;
+ guint32 tac;
+ guint32 cid;
+
+ self = g_task_get_source_object (task);
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (!response ||
+ !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) ||
+ !mbim_message_atds_location_response_parse (response, &lac, &tac, &cid, &error)) {
+ g_task_return_error (task, error);
+ } else {
+ mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), lac, tac, cid);
+ g_task_return_boolean (task, TRUE);
+ }
+ g_object_unref (task);
+}
+
+static void
+register_state_query_ready (MbimDevice *device,
GAsyncResult *res,
- GTask *task)
+ GTask *task)
{
- MbimMessage *response;
- GError *error = NULL;
- MbimRegisterState register_state;
- MbimDataClass available_data_classes;
- gchar *provider_id;
- gchar *provider_name;
+ MMBroadbandModemMbim *self;
+ MbimMessage *response;
+ GError *error = NULL;
+ MbimRegisterState register_state;
+ MbimDataClass available_data_classes;
+ gchar *provider_id;
+ gchar *provider_name;
response = mbim_device_command_finish (device, res, &error);
- if (response &&
- mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) &&
- mbim_message_register_state_response_parse (
+ if (!response ||
+ !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) ||
+ !mbim_message_register_state_response_parse (
response,
NULL, /* nw_error */
&register_state,
@@ -3079,37 +3116,53 @@ register_state_query_ready (MbimDevice *device,
&provider_name,
NULL, /* roaming_text */
NULL, /* registration_flag */
- NULL)) {
- MMBroadbandModemMbim *self;
+ &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ goto out;
+ }
- self = g_task_get_source_object (task);
- update_registration_info (self,
- register_state,
- available_data_classes,
- provider_id,
- provider_name);
+ self = g_task_get_source_object (task);
+ update_registration_info (self,
+ register_state,
+ available_data_classes,
+ provider_id,
+ provider_name);
- g_task_return_boolean (task, TRUE);
- } else
- g_task_return_error (task, error);
+ if (self->priv->is_atds_location_supported) {
+ MbimMessage *message;
+ message = mbim_message_atds_location_query_new (NULL);
+
+ mbim_device_command (device,
+ message,
+ 10,
+ NULL,
+ (GAsyncReadyCallback)atds_location_query_ready,
+ task);
+ mbim_message_unref (message);
+ goto out;
+ }
+
+ g_task_return_boolean (task, TRUE);
g_object_unref (task);
+ out:
if (response)
mbim_message_unref (response);
}
static void
-modem_3gpp_run_registration_checks (MMIfaceModem3gpp *self,
- gboolean cs_supported,
- gboolean ps_supported,
- gboolean eps_supported,
- GAsyncReadyCallback callback,
- gpointer user_data)
+modem_3gpp_run_registration_checks (MMIfaceModem3gpp *self,
+ gboolean cs_supported,
+ gboolean ps_supported,
+ gboolean eps_supported,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
- MbimDevice *device;
+ MbimDevice *device;
MbimMessage *message;
- GTask *task;
+ GTask *task;
if (!peek_device (self, &device, callback, user_data))
return;