base-sim: allow disabling CPOL based preferred networks features

This commit is contained in:
Aleksander Morgado
2021-03-12 10:30:46 +01:00
parent 74599e695b
commit e0a6d5d76b

View File

@@ -964,6 +964,26 @@ handle_send_puk (MMBaseSim *self,
return TRUE; return TRUE;
} }
/*****************************************************************************/
/* 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) */ /* SET PREFERRED NETWORKS (Generic implementation) */
@@ -1374,10 +1394,17 @@ set_preferred_networks (MMBaseSim *self,
GTask *task; GTask *task;
SetPreferredNetworksContext *ctx; SetPreferredNetworksContext *ctx;
mm_obj_dbg (self, "set preferred networks: loading existing networks...");
task = g_task_new (self, NULL, callback, user_data); 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 = g_slice_new0 (SetPreferredNetworksContext);
ctx->set_list = mm_sim_preferred_network_list_copy (preferred_network_list); ctx->set_list = mm_sim_preferred_network_list_copy (preferred_network_list);
ctx->clear_index = g_array_new (FALSE, TRUE, sizeof (guint)); ctx->clear_index = g_array_new (FALSE, TRUE, sizeof (guint));
@@ -1822,6 +1849,17 @@ load_preferred_networks (MMBaseSim *self,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) 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 */ /* 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..."); mm_obj_dbg (self, "selecting user-defined preferred network list...");
@@ -1831,7 +1869,7 @@ load_preferred_networks (MMBaseSim *self,
20, 20,
FALSE, FALSE,
(GAsyncReadyCallback)load_preferred_networks_cpls_command_ready, (GAsyncReadyCallback)load_preferred_networks_cpls_command_ready,
g_task_new (self, NULL, callback, user_data)); task);
} }
/*****************************************************************************/ /*****************************************************************************/