aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem-qmi.c226
1 files changed, 109 insertions, 117 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 64871e74..0c6c9e08 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -1706,16 +1706,21 @@ load_signal_quality (MMIfaceModem *self,
}
/*****************************************************************************/
-/* Power Indication Registration */
+/* Powering up/down/off the modem (Modem interface) */
-static void
-dms_set_operating_mode (MMBroadbandModemQmi *self);
+static gboolean
+modem_power_up_down_off_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
static void
modem_power_indication_deregister (MMBroadbandModemQmi *self)
{
- QmiMessageDmsSetEventReportInput *input = NULL;
- QmiClient *client = NULL;
+ g_autoptr(QmiMessageDmsSetEventReportInput) input = NULL;
+ QmiClient *client;
g_assert (self->priv->power_event_report_indication_id != 0);
g_signal_handler_disconnect (QMI_CLIENT_DMS (client),
@@ -1726,30 +1731,23 @@ modem_power_indication_deregister (MMBroadbandModemQmi *self)
QMI_SERVICE_DMS,
MM_PORT_QMI_FLAG_DEFAULT,
NULL);
- if (!client) {
+ if (!client)
return;
- }
input = qmi_message_dms_set_event_report_input_new ();
qmi_message_dms_set_event_report_input_set_operating_mode_reporting (input, FALSE, NULL);
mm_obj_dbg (self, "Power indication deregistration request is sent");
- qmi_client_dms_set_event_report (
- QMI_CLIENT_DMS (client),
- input,
- 5,
- NULL,
- NULL,
- NULL);
- qmi_message_dms_set_event_report_input_unref (input);
+ qmi_client_dms_set_event_report (QMI_CLIENT_DMS (client), input, 5, NULL, NULL, NULL);
}
static void
dms_set_operating_mode_complete (MMBroadbandModemQmi *self,
- GError *error)
+ GError *error)
{
GTask *task;
- task = g_steal_pointer (&(self->priv->set_operating_mode_task));
+ task = g_steal_pointer (&self->priv->set_operating_mode_task);
+ g_assert (task != NULL);
if (self->priv->set_operating_timeout_id) {
g_source_remove (self->priv->set_operating_timeout_id);
@@ -1758,7 +1756,7 @@ dms_set_operating_mode_complete (MMBroadbandModemQmi *self,
if (self->priv->power_event_report_indication_id) {
modem_power_indication_deregister (self);
}
- g_assert (task != NULL);
+
if (error) {
g_task_return_error (task, error);
} else {
@@ -1779,14 +1777,14 @@ dms_set_operating_mode_timeout_cb (MMBroadbandModemQmi *self)
}
static void
-power_event_report_indication_cb (QmiClientDms *client,
+power_event_report_indication_cb (QmiClientDms *client,
QmiIndicationDmsEventReportOutput *output,
- MMBroadbandModemQmi *self)
+ MMBroadbandModemQmi *self)
{
- QmiDmsOperatingMode state;
- GTask *task;
- GError *error = NULL;
- QmiDmsOperatingMode mode;
+ QmiDmsOperatingMode state;
+ GTask *task;
+ GError *error = NULL;
+ QmiDmsOperatingMode mode;
mm_obj_dbg (self, "Power indication received");
@@ -1798,6 +1796,7 @@ power_event_report_indication_cb (QmiClientDms *client,
g_object_unref (self);
return;
}
+
mm_obj_dbg (self, "Power state update: '%s'",
qmi_dms_operating_mode_get_string (state));
task = self->priv->set_operating_mode_task;
@@ -1808,6 +1807,7 @@ power_event_report_indication_cb (QmiClientDms *client,
g_object_unref (self);
return;
}
+
error = g_error_new (MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Requested mode and mode received by indication did not match");
@@ -1816,89 +1816,14 @@ power_event_report_indication_cb (QmiClientDms *client,
}
static void
-power_indication_activation_callback_ready (QmiClientDms *client,
- GAsyncResult *res,
- MMBroadbandModemQmi *self)
+dms_set_operating_mode_ready (QmiClientDms *client,
+ GAsyncResult *res,
+ MMBroadbandModemQmi *self) /* full reference */
{
- QmiMessageDmsSetEventReportOutput *output;
- GError *error = NULL;
-
- output = qmi_client_dms_set_event_report_finish (client, res, &error);
- if (!output) {
- g_prefix_error (&error, "Power indication activation qmi operation failed");
- dms_set_operating_mode_complete (self, error);
- g_object_unref (self);
- return;
- }
- if (!qmi_message_dms_set_event_report_output_get_result (output, &error)) {
- qmi_message_dms_set_event_report_output_unref (output);
- g_prefix_error (&error, "Power indication failed: couldn't set event report");
- dms_set_operating_mode_complete (self, error);
- g_object_unref (self);
- return;
- }
- qmi_message_dms_set_event_report_output_unref (output);
- g_assert (self->priv->power_event_report_indication_id == 0);
- self->priv->power_event_report_indication_id =
- g_signal_connect (client,
- "event-report",
- G_CALLBACK (power_event_report_indication_cb),
- g_object_ref (self));
- g_assert (self->priv->set_operating_mode_task != NULL);
- mm_obj_dbg (self, "Power operation is pending");
- dms_set_operating_mode (self);
- g_object_unref (self);
-}
-
-static void
-modem_power_indication_register (MMBroadbandModemQmi *self)
-{
- QmiMessageDmsSetEventReportInput *input = NULL;
- QmiClient *client = NULL;
- GError *error = NULL;
-
- client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self),
- QMI_SERVICE_DMS,
- MM_PORT_QMI_FLAG_DEFAULT,
- &error);
-
- if (!client) {
- dms_set_operating_mode_complete (self, error);
- return;
- }
- input = qmi_message_dms_set_event_report_input_new ();
- qmi_message_dms_set_event_report_input_set_operating_mode_reporting (input, TRUE, NULL);
- mm_obj_dbg (self, "Power indication registration request is sent");
- qmi_client_dms_set_event_report (
- QMI_CLIENT_DMS (client),
- input,
- 5,
- NULL,
- (GAsyncReadyCallback)power_indication_activation_callback_ready,
- g_object_ref (self));
- qmi_message_dms_set_event_report_input_unref (input);
-}
-
-/*****************************************************************************/
-/* Powering up the modem (Modem interface) */
-
-static gboolean
-modem_power_up_down_off_finish (MMIfaceModem *self,
- GAsyncResult *res,
- GError **error)
-{
- return g_task_propagate_boolean (G_TASK (res), error);
-}
-
-static void
-dms_set_operating_mode_ready (QmiClientDms *client,
- GAsyncResult *res,
- MMBroadbandModemQmi *self)
-{
- GTask *task;
- QmiDmsOperatingMode mode;
- GError *error = NULL;
- g_autoptr (QmiMessageDmsSetOperatingModeOutput) output = NULL;
+ GTask *task;
+ QmiDmsOperatingMode mode;
+ GError *error = NULL;
+ g_autoptr (QmiMessageDmsSetOperatingModeOutput) output = NULL;
task = self->priv->set_operating_mode_task;
if (task == NULL) {
@@ -1937,21 +1862,21 @@ dms_set_operating_mode_ready (QmiClientDms *client,
}
}
- if (error) {
+ if (error)
dms_set_operating_mode_complete (self, error);
- } else {
+ else
mm_obj_dbg (self, "Waiting for power indication to send success for the task");
- }
+
g_object_unref (self);
}
static void
dms_set_operating_mode (MMBroadbandModemQmi *self)
{
- QmiClient *client = NULL;
- GError *error = NULL;
- GTask *task = NULL;
- QmiDmsOperatingMode mode;
+ QmiClient *client;
+ GError *error = NULL;
+ GTask *task;
+ QmiDmsOperatingMode mode;
g_autoptr (QmiMessageDmsSetOperatingModeInput) input = NULL;
task = self->priv->set_operating_mode_task;
@@ -1964,6 +1889,7 @@ dms_set_operating_mode (MMBroadbandModemQmi *self)
dms_set_operating_mode_complete (self, error);
return;
}
+
input = qmi_message_dms_set_operating_mode_input_new ();
qmi_message_dms_set_operating_mode_input_set_mode (input, mode, NULL);
qmi_client_dms_set_operating_mode (QMI_CLIENT_DMS (client),
@@ -1972,6 +1898,7 @@ dms_set_operating_mode (MMBroadbandModemQmi *self)
NULL,
(GAsyncReadyCallback)dms_set_operating_mode_ready,
g_object_ref (self));
+
mm_obj_dbg (self, "Starting timeout for indication receiving for 10 seconds");
self->priv->set_operating_timeout_id = g_timeout_add_seconds (10,
(GSourceFunc) dms_set_operating_mode_timeout_cb,
@@ -1979,16 +1906,80 @@ dms_set_operating_mode (MMBroadbandModemQmi *self)
}
static void
+dms_set_event_report_operating_mode_activate_ready (QmiClientDms *client,
+ GAsyncResult *res,
+ MMBroadbandModemQmi *self) /* full reference */
+{
+ g_autoptr(QmiMessageDmsSetEventReportOutput) output = NULL;
+ GError *error = NULL;
+
+ output = qmi_client_dms_set_event_report_finish (client, res, &error);
+ if (!output) {
+ g_prefix_error (&error, "Power indication activation qmi operation failed");
+ dms_set_operating_mode_complete (self, error);
+ g_object_unref (self);
+ return;
+ }
+ if (!qmi_message_dms_set_event_report_output_get_result (output, &error)) {
+ g_prefix_error (&error, "Power indication failed: couldn't set event report");
+ dms_set_operating_mode_complete (self, error);
+ g_object_unref (self);
+ return;
+ }
+
+ g_assert (self->priv->power_event_report_indication_id == 0);
+ self->priv->power_event_report_indication_id =
+ g_signal_connect (client,
+ "event-report",
+ G_CALLBACK (power_event_report_indication_cb),
+ g_object_ref (self));
+
+ g_assert (self->priv->set_operating_mode_task != NULL);
+ mm_obj_dbg (self, "Power operation is pending");
+
+ dms_set_operating_mode (self);
+ g_object_unref (self);
+}
+
+static void
+modem_power_indication_register (MMBroadbandModemQmi *self)
+{
+ g_autoptr(QmiMessageDmsSetEventReportInput) input = NULL;
+ QmiClient *client;
+ GError *error = NULL;
+
+ client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self),
+ QMI_SERVICE_DMS,
+ MM_PORT_QMI_FLAG_DEFAULT,
+ &error);
+
+ if (!client) {
+ dms_set_operating_mode_complete (self, error);
+ return;
+ }
+
+ input = qmi_message_dms_set_event_report_input_new ();
+ qmi_message_dms_set_event_report_input_set_operating_mode_reporting (input, TRUE, NULL);
+ mm_obj_dbg (self, "Power indication registration request is sent");
+ qmi_client_dms_set_event_report (
+ QMI_CLIENT_DMS (client),
+ input,
+ 5,
+ NULL,
+ (GAsyncReadyCallback)dms_set_event_report_operating_mode_activate_ready,
+ g_object_ref (self));
+}
+
+static void
common_power_up_down_off (MMIfaceModem *_self,
QmiDmsOperatingMode mode,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GTask *task;
- GError *error = NULL;
- MMBroadbandModemQmi *self = NULL;
+ GTask *task;
+ GError *error = NULL;
+ MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self);
- self = MM_BROADBAND_MODEM_QMI (_self);
task = g_task_new (self, NULL, callback, user_data);
g_task_set_task_data (task, GUINT_TO_POINTER (mode), NULL);
@@ -1998,6 +1989,7 @@ common_power_up_down_off (MMIfaceModem *_self,
g_object_unref (task);
return;
}
+
self->priv->set_operating_mode_task = task;
modem_power_indication_register (self);
}