aboutsummaryrefslogtreecommitdiff
path: root/src/mm-iface-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-iface-modem.c')
-rw-r--r--src/mm-iface-modem.c68
1 files changed, 59 insertions, 9 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 3806661c..7712f602 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -28,6 +28,7 @@
#include "mm-private-boxed-types.h"
#include "mm-log-object.h"
#include "mm-context.h"
+#include "mm-fcc-unlock-dispatcher.h"
#if defined WITH_QMI
# include "mm-broadband-modem-qmi.h"
#endif
@@ -3844,15 +3845,18 @@ modem_after_power_up_ready (MMIfaceModem *self,
}
static void
-fcc_unlock_ready (MMIfaceModem *self,
- GAsyncResult *res,
- GTask *task)
+fcc_unlock_dispatcher_ready (MMFccUnlockDispatcher *dispatcher,
+ GAsyncResult *res,
+ GTask *task)
{
+ MMIfaceModem *self;
SetPowerStateContext *ctx;
g_autoptr(GError) error = NULL;
+ self = g_task_get_source_object (task);
ctx = g_task_get_task_data (task);
- if (!MM_IFACE_MODEM_GET_INTERFACE (self)->fcc_unlock_finish (self, res, &error))
+
+ if (!mm_fcc_unlock_dispatcher_run_finish (dispatcher, res, &error))
mm_obj_dbg (self, "couldn't run FCC unlock: %s", error->message);
/* always retry, even on reported error */
@@ -3861,6 +3865,54 @@ fcc_unlock_ready (MMIfaceModem *self,
}
static void
+fcc_unlock (GTask *task)
+{
+ MMIfaceModem *self;
+ MMFccUnlockDispatcher *dispatcher;
+ MMModemPortInfo *port_infos;
+ guint n_port_infos = 0;
+ guint i;
+ GPtrArray *aux;
+ g_auto(GStrv) modem_ports = NULL;
+
+ self = g_task_get_source_object (task);
+
+ dispatcher = mm_fcc_unlock_dispatcher_get ();
+
+ aux = g_ptr_array_new ();
+ port_infos = mm_base_modem_get_port_infos (MM_BASE_MODEM (self), &n_port_infos);
+ for (i = 0; i < n_port_infos; i++) {
+ switch (port_infos[i].type) {
+ case MM_MODEM_PORT_TYPE_AT:
+ case MM_MODEM_PORT_TYPE_QMI:
+ case MM_MODEM_PORT_TYPE_MBIM:
+ g_ptr_array_add (aux, g_strdup (port_infos[i].name));
+ break;
+ case MM_MODEM_PORT_TYPE_UNKNOWN:
+ case MM_MODEM_PORT_TYPE_NET:
+ case MM_MODEM_PORT_TYPE_QCDM:
+ case MM_MODEM_PORT_TYPE_GPS:
+ case MM_MODEM_PORT_TYPE_AUDIO:
+ case MM_MODEM_PORT_TYPE_IGNORED:
+ default:
+ break;
+ }
+ }
+ mm_modem_port_info_array_free (port_infos, n_port_infos);
+ g_ptr_array_add (aux, NULL);
+ modem_ports = (GStrv) g_ptr_array_free (aux, FALSE);
+
+ mm_fcc_unlock_dispatcher_run (dispatcher,
+ mm_base_modem_get_vendor_id (MM_BASE_MODEM (self)),
+ mm_base_modem_get_product_id (MM_BASE_MODEM (self)),
+ g_dbus_object_get_object_path (G_DBUS_OBJECT (self)),
+ modem_ports,
+ g_task_get_cancellable (task),
+ (GAsyncReadyCallback)fcc_unlock_dispatcher_ready,
+ task);
+}
+
+static void
requested_power_setup_ready (MMIfaceModem *self,
GAsyncResult *res,
GTask *task)
@@ -3959,13 +4011,11 @@ set_power_state_step (GTask *task)
if ((ctx->requested_power_state == MM_MODEM_POWER_STATE_ON) &&
ctx->saved_error &&
g_error_matches (ctx->saved_error, MM_CORE_ERROR, MM_CORE_ERROR_RETRY) &&
- !ctx->fcc_unlock_attempted &&
- MM_IFACE_MODEM_GET_INTERFACE (self)->fcc_unlock &&
- MM_IFACE_MODEM_GET_INTERFACE (self)->fcc_unlock_finish) {
+ !ctx->fcc_unlock_attempted) {
mm_obj_dbg (self, "attempting fcc unlock...");
- ctx->fcc_unlock_attempted = TRUE;
g_clear_error (&ctx->saved_error);
- MM_IFACE_MODEM_GET_INTERFACE (self)->fcc_unlock (self, (GAsyncReadyCallback)fcc_unlock_ready, task);
+ ctx->fcc_unlock_attempted = TRUE;
+ fcc_unlock (task);
return;
}
ctx->step++;