iface-modem-sar: report updated level on SAR enable

The SAR enable operation may be selecting an explicit SAR level by
itself, so make sure the protocol implementation reports back to the
interface the default level that was used while enabling SAR.

No level change is reported in the interface if the SAR is being
disabled.
This commit is contained in:
Aleksander Morgado
2022-09-19 10:38:00 +00:00
committed by Aleksander Morgado
parent 950d36d4ee
commit 1ea5a577e3
4 changed files with 32 additions and 6 deletions

View File

@@ -8205,9 +8205,18 @@ sar_load_power_level (MMIfaceModemSar *_self,
static gboolean static gboolean
sar_enable_finish (MMIfaceModemSar *self, sar_enable_finish (MMIfaceModemSar *self,
GAsyncResult *res, GAsyncResult *res,
guint *out_sar_power_level,
GError **error) GError **error)
{ {
return g_task_propagate_boolean (G_TASK (res), error); guint level;
if (!g_task_propagate_boolean (G_TASK (res), error))
return FALSE;
level = GPOINTER_TO_UINT (g_task_get_task_data (G_TASK (res)));
if (out_sar_power_level)
*out_sar_power_level = level;
return TRUE;
} }
static void static void
@@ -8253,6 +8262,8 @@ sar_enable (MMIfaceModemSar *_self,
config_state->antenna_index = 0xFFFFFFFF; config_state->antenna_index = 0xFFFFFFFF;
config_state->backoff_index = mm_iface_modem_sar_get_power_level (_self); config_state->backoff_index = mm_iface_modem_sar_get_power_level (_self);
g_task_set_task_data (task, GUINT_TO_POINTER (config_state->backoff_index), NULL);
message = mbim_message_ms_sar_config_set_new (MBIM_SAR_CONTROL_MODE_OS, message = mbim_message_ms_sar_config_set_new (MBIM_SAR_CONTROL_MODE_OS,
enable ? MBIM_SAR_BACKOFF_STATE_ENABLED : MBIM_SAR_BACKOFF_STATE_DISABLED, enable ? MBIM_SAR_BACKOFF_STATE_ENABLED : MBIM_SAR_BACKOFF_STATE_DISABLED,
1, (const MbimSarConfigState **)&config_state, NULL); 1, (const MbimSarConfigState **)&config_state, NULL);

View File

@@ -8468,9 +8468,18 @@ sar_load_power_level (MMIfaceModemSar *self,
static gboolean static gboolean
sar_enable_finish (MMIfaceModemSar *self, sar_enable_finish (MMIfaceModemSar *self,
GAsyncResult *res, GAsyncResult *res,
guint *out_sar_power_level,
GError **error) GError **error)
{ {
return g_task_propagate_boolean (G_TASK (res), error); QmiSarRfState level;
if (!g_task_propagate_boolean (G_TASK (res), error))
return FALSE;
level = GPOINTER_TO_UINT (g_task_get_task_data (G_TASK (res)));
if (out_sar_power_level)
*out_sar_power_level = level;
return TRUE;
} }
static void static void
@@ -8499,6 +8508,7 @@ sar_enable (MMIfaceModemSar *self,
g_autoptr(QmiMessageSarRfSetStateInput) input = NULL; g_autoptr(QmiMessageSarRfSetStateInput) input = NULL;
GTask *task; GTask *task;
QmiClient *client = NULL; QmiClient *client = NULL;
QmiSarRfState level;
if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
QMI_SERVICE_SAR, &client, QMI_SERVICE_SAR, &client,
@@ -8507,9 +8517,10 @@ sar_enable (MMIfaceModemSar *self,
task = g_task_new (self, NULL, callback, user_data); task = g_task_new (self, NULL, callback, user_data);
input = qmi_message_sar_rf_set_state_input_new (); input = qmi_message_sar_rf_set_state_input_new ();
qmi_message_sar_rf_set_state_input_set_state (input,
enable ? QMI_SAR_ENABLE_POWER_INDEX : QMI_SAR_DISABLED_POWER_INDEX, level = enable ? QMI_SAR_ENABLE_POWER_INDEX : QMI_SAR_DISABLED_POWER_INDEX;
NULL); qmi_message_sar_rf_set_state_input_set_state (input, level, NULL);
g_task_set_task_data (task, GUINT_TO_POINTER (level), NULL);
qmi_client_sar_rf_set_state ( qmi_client_sar_rf_set_state (
QMI_CLIENT_SAR (client), QMI_CLIENT_SAR (client),

View File

@@ -78,12 +78,15 @@ enable_ready (MMIfaceModemSar *self,
HandleEnableContext *ctx) HandleEnableContext *ctx)
{ {
GError *error = NULL; GError *error = NULL;
guint power_level = 0;
if (!MM_IFACE_MODEM_SAR_GET_INTERFACE (ctx->self)->enable_finish (self, res, &error)) if (!MM_IFACE_MODEM_SAR_GET_INTERFACE (ctx->self)->enable_finish (self, res, &power_level, &error))
g_dbus_method_invocation_take_error (ctx->invocation, error); g_dbus_method_invocation_take_error (ctx->invocation, error);
else { else {
/* Update current features in the interface */ /* Update current features in the interface */
mm_gdbus_modem_sar_set_state (ctx->skeleton, ctx->enable); mm_gdbus_modem_sar_set_state (ctx->skeleton, ctx->enable);
if (ctx->enable)
mm_gdbus_modem_sar_set_power_level (ctx->skeleton, power_level);
mm_gdbus_modem_sar_complete_enable (ctx->skeleton, ctx->invocation); mm_gdbus_modem_sar_complete_enable (ctx->skeleton, ctx->invocation);
} }

View File

@@ -48,6 +48,7 @@ struct _MMIfaceModemSar {
gpointer user_data); gpointer user_data);
gboolean (* enable_finish) (MMIfaceModemSar *self, gboolean (* enable_finish) (MMIfaceModemSar *self,
GAsyncResult *res, GAsyncResult *res,
guint *out_sar_power_level,
GError **error); GError **error);
/* Get SAR state (async) */ /* Get SAR state (async) */
void (* load_state) (MMIfaceModemSar *self, void (* load_state) (MMIfaceModemSar *self,