aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-base-sim.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c
index 4d9be3ee..87b300bd 100644
--- a/src/mm-base-sim.c
+++ b/src/mm-base-sim.c
@@ -965,6 +965,26 @@ handle_send_puk (MMBaseSim *self,
}
/*****************************************************************************/
+/* Check if preferred networks is supported.
+ *
+ * Modems like the Intel-based EM7345 fail very badly when CPOL? is run, even
+ * completely blocking the AT port after that. We need to avoid running any
+ * CPOL related command in these modules.
+ */
+
+static gboolean
+check_preferred_networks_disabled (MMBaseSim *self)
+{
+ MMPort *primary;
+
+ primary = MM_PORT (mm_base_modem_peek_port_primary (self->priv->modem));
+ return (primary ?
+ mm_kernel_device_get_global_property_as_boolean (mm_port_peek_kernel_device (primary),
+ "ID_MM_PREFERRED_NETWORKS_CPOL_DISABLED") :
+ FALSE);
+}
+
+/*****************************************************************************/
/* SET PREFERRED NETWORKS (Generic implementation) */
/* Setting preferred network list with AT+CPOL is a complicated procedure with
@@ -1374,10 +1394,17 @@ set_preferred_networks (MMBaseSim *self,
GTask *task;
SetPreferredNetworksContext *ctx;
- mm_obj_dbg (self, "set preferred networks: loading existing networks...");
-
task = g_task_new (self, NULL, callback, user_data);
+ if (check_preferred_networks_disabled (self)) {
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "setting preferred networks is unsupported");
+ g_object_unref (task);
+ return;
+ }
+
+ mm_obj_dbg (self, "set preferred networks: loading existing networks...");
+
ctx = g_slice_new0 (SetPreferredNetworksContext);
ctx->set_list = mm_sim_preferred_network_list_copy (preferred_network_list);
ctx->clear_index = g_array_new (FALSE, TRUE, sizeof (guint));
@@ -1822,6 +1849,17 @@ load_preferred_networks (MMBaseSim *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ GTask *task;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ if (check_preferred_networks_disabled (self)) {
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "setting preferred networks is unsupported");
+ g_object_unref (task);
+ return;
+ }
+
/* Invoke AT+CPLS=0 first to make sure the correct (user-defined) preferred network list is selected */
mm_obj_dbg (self, "selecting user-defined preferred network list...");
@@ -1831,7 +1869,7 @@ load_preferred_networks (MMBaseSim *self,
20,
FALSE,
(GAsyncReadyCallback)load_preferred_networks_cpls_command_ready,
- g_task_new (self, NULL, callback, user_data));
+ task);
}
/*****************************************************************************/