aboutsummaryrefslogtreecommitdiff
path: root/src/mm-iface-modem.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-10-25 21:39:46 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-11-17 11:30:01 +0100
commit81302efa661f848455a1bfe44b27608b11d6d49b (patch)
treec4ee58c60d071f992c6bab8c8016e557e6d490eb /src/mm-iface-modem.c
parent21c775703c9e3852fdda206a9658cb236613ef85 (diff)
iface-modem: use external dispatcher to attempt FCC unlock
We remove the built-in FCC unlock procedures from the ModemManager, we will no longer run them automatically, and instead rely on external scripts/programs to do that. Packages providing the external FCC unlock tools can install them in ${pkglibdir}/fcc-unlock.d. Users manually enabling external FCC unlock tools can install them in ${pkgsysconfdir}/fcc-unlock.d. The user-enabled path takes precedence over the package-enabled one.
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++;