broadband-modem-mbim: fallback to trying AT+CESQ if ATDS signal unsupported

This commit is contained in:
Aleksander Morgado
2018-08-09 17:07:30 +02:00
committed by Dan Williams
parent ab9130682c
commit b378be0f0d

View File

@@ -50,6 +50,8 @@ static void iface_modem_location_init (MMIfaceModemLocation *iface);
static void iface_modem_messaging_init (MMIfaceModemMessaging *iface);
static void iface_modem_signal_init (MMIfaceModemSignal *iface);
static MMIfaceModemSignal *iface_modem_signal_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemMbim, mm_broadband_modem_mbim, MM_TYPE_BROADBAND_MODEM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init)
@@ -3347,6 +3349,18 @@ modem_signal_check_support_finish (MMIfaceModemSignal *self,
return g_task_propagate_boolean (G_TASK (res), error);
}
static void
parent_signal_check_support_ready (MMIfaceModemSignal *self,
GAsyncResult *res,
GTask *task)
{
gboolean parent_supported;
parent_supported = iface_modem_signal_parent->check_support_finish (self, res, NULL);
g_task_return_boolean (task, parent_supported);
g_object_unref (task);
}
static void
modem_signal_check_support (MMIfaceModemSignal *self,
GAsyncReadyCallback callback,
@@ -3355,8 +3369,19 @@ modem_signal_check_support (MMIfaceModemSignal *self,
GTask *task;
task = g_task_new (self, NULL, callback, user_data);
g_task_return_boolean (task, MM_BROADBAND_MODEM_MBIM (self)->priv->is_atds_signal_supported);
g_object_unref (task);
/* If ATDS signal is supported, we support the Signal interface */
if (MM_BROADBAND_MODEM_MBIM (self)->priv->is_atds_signal_supported) {
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
}
/* Otherwise, check if the parent CESQ-based implementation works */
g_assert (iface_modem_signal_parent->check_support && iface_modem_signal_parent->check_support_finish);
iface_modem_signal_parent->check_support (self,
(GAsyncReadyCallback)parent_signal_check_support_ready,
task);
}
/*****************************************************************************/
@@ -3500,6 +3525,30 @@ atds_signal_query_ready (MbimDevice *device,
g_object_unref (task);
}
static void
parent_signal_load_values_ready (MMIfaceModemSignal *self,
GAsyncResult *res,
GTask *task)
{
SignalLoadValuesResult *result;
GError *error = NULL;
result = g_slice_new0 (SignalLoadValuesResult);
if (!iface_modem_signal_parent->load_values_finish (self, res,
NULL, NULL,
&result->gsm, &result->umts, &result->lte,
&error)) {
signal_load_values_result_free (result);
g_task_return_error (task, error);
} else if (!result->gsm && !result->umts && !result->lte) {
signal_load_values_result_free (result);
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"No signal details given");
} else
g_task_return_pointer (task, result, (GDestroyNotify) signal_load_values_result_free);
g_object_unref (task);
}
static void
modem_signal_load_values (MMIfaceModemSignal *self,
GCancellable *cancellable,
@@ -3515,14 +3564,24 @@ modem_signal_load_values (MMIfaceModemSignal *self,
task = g_task_new (self, NULL, callback, user_data);
message = mbim_message_atds_signal_query_new (NULL);
mbim_device_command (device,
message,
5,
NULL,
(GAsyncReadyCallback)atds_signal_query_ready,
task);
mbim_message_unref (message);
if (MM_BROADBAND_MODEM_MBIM (self)->priv->is_atds_signal_supported) {
message = mbim_message_atds_signal_query_new (NULL);
mbim_device_command (device,
message,
5,
NULL,
(GAsyncReadyCallback)atds_signal_query_ready,
task);
mbim_message_unref (message);
return;
}
/* Fallback to parent CESQ based implementation */
g_assert (iface_modem_signal_parent->load_values && iface_modem_signal_parent->load_values_finish);
iface_modem_signal_parent->load_values (self,
NULL,
(GAsyncReadyCallback)parent_signal_load_values_ready,
task);
}
/*****************************************************************************/
@@ -3966,6 +4025,8 @@ iface_modem_messaging_init (MMIfaceModemMessaging *iface)
static void
iface_modem_signal_init (MMIfaceModemSignal *iface)
{
iface_modem_signal_parent = g_type_interface_peek_parent (iface);
iface->check_support = modem_signal_check_support;
iface->check_support_finish = modem_signal_check_support_finish;
iface->load_values = modem_signal_load_values;