broadband-modem-qmi: don't fail on power indication registration error

This commit modifies the QMI DMS Operating Mode indication registration logic.
During the power sequence chance, if a QMI_PROTOCOL_ERROR_MISSING_ARGUMENT error
was returned in "DMS Set Event Report" operation for Operating Mode Reporting failed,
the whole sequence was aborted, leading the modem to be disabled.

<debug> [modem0] Power indication registration request is sent
...
<debug> [modem0] couldn't update power state: Couldn't register for power indications: QMI protocol error (17): 'MissingArgument'
<warn>  [modem0] couldn't enable interface: 'Couldn't register for power indications: QMI protocol error (17): 'MissingArgument''
<debug> [modem0] running implicit disable after failed enable...

This commit modifies the logic to properly detect the failure and
continue the sequence without the indications.

Fixes #683

Signed-off-by: Louis-Alexis Eyraud <louis-alexis.eyraud@unabiz.com>
This commit is contained in:
Louis-Alexis Eyraud
2023-01-23 14:49:33 +00:00
committed by Aleksander Morgado
parent 90c1788be0
commit 6006dd1d63
+31 -16
View File
@@ -1869,14 +1869,17 @@ dms_set_operating_mode_ready (QmiClientDms *client,
set_operating_mode_complete (self, NULL);
} else if (error)
set_operating_mode_complete (self, error);
else
else if (ctx->timeout_id)
mm_obj_dbg (self, "operating mode request sent, waiting for power update indication");
else
set_operating_mode_complete (self, NULL);
g_object_unref (self);
}
static void
dms_set_operating_mode (MMBroadbandModemQmi *self)
dms_set_operating_mode (MMBroadbandModemQmi *self,
gboolean supports_power_indications)
{
g_autoptr (QmiMessageDmsSetOperatingModeInput) input = NULL;
SetOperatingModeContext *ctx;
@@ -1893,10 +1896,12 @@ dms_set_operating_mode (MMBroadbandModemQmi *self)
(GAsyncReadyCallback)dms_set_operating_mode_ready,
g_object_ref (self));
mm_obj_dbg (self, "Starting timeout for indication receiving for 10 seconds");
ctx->timeout_id = g_timeout_add_seconds (10,
(GSourceFunc) dms_set_operating_mode_timeout_cb,
self);
if (supports_power_indications) {
mm_obj_dbg (self, "Starting timeout for indication receiving for 10 seconds");
ctx->timeout_id = g_timeout_add_seconds (10,
(GSourceFunc) dms_set_operating_mode_timeout_cb,
self);
}
}
static void
@@ -1907,26 +1912,36 @@ dms_set_event_report_operating_mode_activate_ready (QmiClientDms *client,
g_autoptr(QmiMessageDmsSetEventReportOutput) output = NULL;
GError *error = NULL;
SetOperatingModeContext *ctx;
gboolean supports_power_indications = TRUE;
g_assert (self->priv->set_operating_mode_task);
ctx = g_task_get_task_data (self->priv->set_operating_mode_task);
output = qmi_client_dms_set_event_report_finish (client, res, &error);
if (!output || !qmi_message_dms_set_event_report_output_get_result (output, &error)) {
g_prefix_error (&error, "Couldn't register for power indications: ");
set_operating_mode_complete (self, error);
g_object_unref (self);
return;
if (g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_MISSING_ARGUMENT)) {
mm_obj_dbg (self, "device doesn't support power indication registration: ignore it and continue");
g_clear_error (&error);
supports_power_indications = FALSE;
} else {
g_prefix_error (&error, "Couldn't register for power indications: ");
set_operating_mode_complete (self, error);
g_object_unref (self);
return;
}
}
g_assert (ctx->indication_id == 0);
ctx->indication_id = g_signal_connect (client,
"event-report",
G_CALLBACK (power_event_report_indication_cb),
self);
if (supports_power_indications) {
ctx->indication_id = g_signal_connect (client,
"event-report",
G_CALLBACK (power_event_report_indication_cb),
self);
mm_obj_dbg (self, "Power operation is pending");
}
mm_obj_dbg (self, "Power operation is pending");
dms_set_operating_mode (self);
dms_set_operating_mode (self,
supports_power_indications);
g_object_unref (self);
}