cinterion: remove custom logic to power down modem before initial EPS bearer settings update

This commit is contained in:
Aleksander Morgado
2024-05-29 08:14:12 +00:00
parent cf1035169c
commit 1263905753
@@ -1173,32 +1173,6 @@ load_initial_eps_bearer_cid (MMBroadbandModemCinterion *self,
/*****************************************************************************/
/* Set initial EPS bearer settings */
typedef enum {
SET_INITIAL_EPS_STEP_FIRST = 0,
SET_INITIAL_EPS_STEP_CHECK_MODE,
SET_INITIAL_EPS_STEP_RF_OFF,
SET_INITIAL_EPS_STEP_APN,
SET_INITIAL_EPS_STEP_AUTH,
SET_INITIAL_EPS_STEP_RF_ON,
SET_INITIAL_EPS_STEP_LAST,
} SetInitialEpsStep;
typedef struct {
MMBearerProperties *properties;
SetInitialEpsStep step;
guint initial_cfun_mode;
GError *saved_error;
} SetInitialEpsContext;
static void
set_initial_eps_context_free (SetInitialEpsContext *ctx)
{
g_assert (!ctx->saved_error);
g_object_unref (ctx->properties);
g_slice_free (SetInitialEpsContext, ctx);
}
static gboolean
modem_3gpp_set_initial_eps_bearer_settings_finish (MMIfaceModem3gpp *self,
GAsyncResult *res,
@@ -1207,49 +1181,21 @@ modem_3gpp_set_initial_eps_bearer_settings_finish (MMIfaceModem3gpp *self,
return g_task_propagate_boolean (G_TASK (res), error);
}
static void set_initial_eps_step (GTask *task);
static void
set_initial_eps_rf_on_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
g_autoptr(GError) error = NULL;
SetInitialEpsContext *ctx;
ctx = (SetInitialEpsContext *) g_task_get_task_data (task);
if (!mm_base_modem_at_command_finish (self, res, &error)) {
mm_obj_warn (self, "couldn't set RF back on: %s", error->message);
if (!ctx->saved_error)
ctx->saved_error = g_steal_pointer (&error);
}
/* Go to next step */
ctx->step++;
set_initial_eps_step (task);
}
static void
set_initial_eps_auth_ready (MMBaseModem *_self,
GAsyncResult *res,
GTask *task)
{
MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
SetInitialEpsContext *ctx;
GError *error = NULL;
ctx = (SetInitialEpsContext *) g_task_get_task_data (task);
if (!mm_base_modem_at_command_finish (_self, res, &ctx->saved_error)) {
if (!mm_base_modem_at_command_finish (_self, res, &error)) {
mm_obj_warn (self, "couldn't configure context %d auth settings: %s",
self->priv->initial_eps_bearer_cid, ctx->saved_error->message);
/* Fallback to recover RF before returning the error */
ctx->step = SET_INITIAL_EPS_STEP_RF_ON;
} else {
/* Go to next step */
ctx->step++;
}
set_initial_eps_step (task);
self->priv->initial_eps_bearer_cid, error->message);
g_task_return_error (task, error);
} else
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
static void
@@ -1258,209 +1204,70 @@ set_initial_eps_cgdcont_ready (MMBaseModem *_self,
GTask *task)
{
MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
SetInitialEpsContext *ctx;
MMBearerProperties *properties;
GError *error = NULL;
g_autofree gchar *auth_cmd = NULL;
ctx = (SetInitialEpsContext *) g_task_get_task_data (task);
if (!mm_base_modem_at_command_finish (_self, res, &ctx->saved_error)) {
if (!mm_base_modem_at_command_finish (_self, res, &error)) {
mm_obj_warn (self, "couldn't configure context %d settings: %s",
self->priv->initial_eps_bearer_cid, ctx->saved_error->message);
/* Fallback to recover RF before returning the error */
ctx->step = SET_INITIAL_EPS_STEP_RF_ON;
} else {
/* Go to next step */
ctx->step++;
}
set_initial_eps_step (task);
}
static void
set_initial_eps_rf_off_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
GError *error = NULL;
SetInitialEpsContext *ctx;
ctx = (SetInitialEpsContext *) g_task_get_task_data (task);
if (!mm_base_modem_at_command_finish (self, res, &error)) {
mm_obj_warn (self, "couldn't set RF off: %s", error->message);
self->priv->initial_eps_bearer_cid, error->message);
g_task_return_error (task, error);
g_object_unref (task);
return;
}
/* Go to next step */
ctx->step++;
set_initial_eps_step (task);
properties = g_task_get_task_data (task);
auth_cmd = mm_cinterion_build_auth_string (self,
MM_BROADBAND_MODEM_CINTERION (self)->priv->modem_family,
properties,
self->priv->initial_eps_bearer_cid);
mm_base_modem_at_command (
_self,
auth_cmd,
20,
FALSE,
(GAsyncReadyCallback)set_initial_eps_auth_ready,
task);
}
static void
set_initial_eps_cfun_mode_load_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
GError *error = NULL;
const gchar *response;
SetInitialEpsContext *ctx;
guint mode;
ctx = (SetInitialEpsContext *) g_task_get_task_data (task);
response = mm_base_modem_at_command_finish (self, res, &error);
if (!response || !mm_3gpp_parse_cfun_query_response (response, &mode, &error)) {
mm_obj_warn (self, "couldn't load initial functionality mode: %s", error->message);
g_task_return_error (task, error);
g_object_unref (task);
return;
}
mm_obj_dbg (self, "current functionality mode: %u", mode);
if (mode != 1 && mode != 4) {
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE,
"cannot setup the default LTE bearer settings: "
"the SIM must be powered");
g_task_return_error (task, error);
g_object_unref (task);
return;
}
ctx->initial_cfun_mode = mode;
ctx->step++;
set_initial_eps_step (task);
}
static void
set_initial_eps_step (GTask *task)
{
MMBroadbandModemCinterion *self;
SetInitialEpsContext *ctx;
self = g_task_get_source_object (task);
ctx = g_task_get_task_data (task);
switch (ctx->step) {
case SET_INITIAL_EPS_STEP_FIRST:
ctx->step++;
/* fall through */
case SET_INITIAL_EPS_STEP_CHECK_MODE:
mm_base_modem_at_command (
MM_BASE_MODEM (self),
"+CFUN?",
5,
FALSE,
(GAsyncReadyCallback)set_initial_eps_cfun_mode_load_ready,
task);
return;
case SET_INITIAL_EPS_STEP_RF_OFF:
if (ctx->initial_cfun_mode != 4) {
mm_base_modem_at_command (
MM_BASE_MODEM (self),
"+CFUN=4",
5,
FALSE,
(GAsyncReadyCallback)set_initial_eps_rf_off_ready,
task);
return;
}
ctx->step++;
/* fall through */
case SET_INITIAL_EPS_STEP_APN: {
const gchar *apn;
g_autofree gchar *quoted_apn = NULL;
g_autofree gchar *apn_cmd = NULL;
const gchar *ip_family_str;
MMBearerIpFamily ip_family;
ip_family = mm_bearer_properties_get_ip_type (ctx->properties);
if (ip_family == MM_BEARER_IP_FAMILY_NONE || ip_family == MM_BEARER_IP_FAMILY_ANY)
ip_family = MM_BEARER_IP_FAMILY_IPV4;
ip_family_str = mm_3gpp_get_pdp_type_from_ip_family (ip_family);
apn = mm_bearer_properties_get_apn (ctx->properties);
mm_obj_dbg (self, "context %d with APN '%s' and PDP type '%s'",
self->priv->initial_eps_bearer_cid, apn, ip_family_str);
quoted_apn = mm_at_quote_string (apn);
apn_cmd = g_strdup_printf ("+CGDCONT=%u,\"%s\",%s",
self->priv->initial_eps_bearer_cid, ip_family_str, quoted_apn);
mm_base_modem_at_command (
MM_BASE_MODEM (self),
apn_cmd,
20,
FALSE,
(GAsyncReadyCallback)set_initial_eps_cgdcont_ready,
task);
return;
}
case SET_INITIAL_EPS_STEP_AUTH: {
g_autofree gchar *auth_cmd = NULL;
auth_cmd = mm_cinterion_build_auth_string (self,
MM_BROADBAND_MODEM_CINTERION (self)->priv->modem_family,
ctx->properties,
self->priv->initial_eps_bearer_cid);
mm_base_modem_at_command (
MM_BASE_MODEM (self),
auth_cmd,
20,
FALSE,
(GAsyncReadyCallback)set_initial_eps_auth_ready,
task);
return;
}
case SET_INITIAL_EPS_STEP_RF_ON:
if (ctx->initial_cfun_mode == 1) {
mm_base_modem_at_command (
MM_BASE_MODEM (self),
"+CFUN=1",
5,
FALSE,
(GAsyncReadyCallback)set_initial_eps_rf_on_ready,
task);
return;
}
ctx->step++;
/* fall through */
case SET_INITIAL_EPS_STEP_LAST:
if (ctx->saved_error)
g_task_return_error (task, g_steal_pointer (&ctx->saved_error));
else
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
default:
g_assert_not_reached ();
}
}
static void
modem_3gpp_set_initial_eps_bearer_settings (MMIfaceModem3gpp *self,
modem_3gpp_set_initial_eps_bearer_settings (MMIfaceModem3gpp *_self,
MMBearerProperties *properties,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
SetInitialEpsContext *ctx;
task = g_task_new (self, NULL, callback, user_data);
MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
GTask *task;
const gchar *apn;
g_autofree gchar *quoted_apn = NULL;
g_autofree gchar *apn_cmd = NULL;
const gchar *ip_family_str;
MMBearerIpFamily ip_family;
/* The initial EPS bearer settings should have already been loaded */
g_assert (MM_BROADBAND_MODEM_CINTERION (self)->priv->initial_eps_bearer_cid >= 0);
g_assert (self->priv->initial_eps_bearer_cid >= 0);
/* Setup context */
ctx = g_slice_new0 (SetInitialEpsContext);
ctx->properties = g_object_ref (properties);
ctx->step = SET_INITIAL_EPS_STEP_FIRST;
g_task_set_task_data (task, ctx, (GDestroyNotify) set_initial_eps_context_free);
task = g_task_new (self, NULL, callback, user_data);
g_task_set_task_data (task, g_object_ref (properties), (GDestroyNotify) g_object_unref);
set_initial_eps_step (task);
ip_family = mm_bearer_properties_get_ip_type (properties);
if (ip_family == MM_BEARER_IP_FAMILY_NONE || ip_family == MM_BEARER_IP_FAMILY_ANY)
ip_family = MM_BEARER_IP_FAMILY_IPV4;
ip_family_str = mm_3gpp_get_pdp_type_from_ip_family (ip_family);
apn = mm_bearer_properties_get_apn (properties);
mm_obj_dbg (self, "context %d with APN '%s' and PDP type '%s'",
self->priv->initial_eps_bearer_cid, apn, ip_family_str);
quoted_apn = mm_at_quote_string (apn);
apn_cmd = g_strdup_printf ("+CGDCONT=%u,\"%s\",%s",
self->priv->initial_eps_bearer_cid, ip_family_str, quoted_apn);
mm_base_modem_at_command (
MM_BASE_MODEM (self),
apn_cmd,
20,
FALSE,
(GAsyncReadyCallback)set_initial_eps_cgdcont_ready,
task);
}
/*****************************************************************************/