aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2022-09-19 10:38:00 +0000
committerAleksander Morgado <aleksander@aleksander.es>2022-09-27 08:28:07 +0000
commit1ea5a577e38ebb5393a7b15e59b585acb659cfce (patch)
tree92f73a9da6944a6424b4a6d51b8b784c43abb6cd
parent950d36d4ee6c36c606a662a07a877b765c94c11c (diff)
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.
-rw-r--r--src/mm-broadband-modem-mbim.c13
-rw-r--r--src/mm-broadband-modem-qmi.c19
-rw-r--r--src/mm-iface-modem-sar.c5
-rw-r--r--src/mm-iface-modem-sar.h1
4 files changed, 32 insertions, 6 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 14b1571f..c9c11435 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -8205,9 +8205,18 @@ sar_load_power_level (MMIfaceModemSar *_self,
static gboolean
sar_enable_finish (MMIfaceModemSar *self,
GAsyncResult *res,
+ guint *out_sar_power_level,
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
@@ -8253,6 +8262,8 @@ sar_enable (MMIfaceModemSar *_self,
config_state->antenna_index = 0xFFFFFFFF;
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,
enable ? MBIM_SAR_BACKOFF_STATE_ENABLED : MBIM_SAR_BACKOFF_STATE_DISABLED,
1, (const MbimSarConfigState **)&config_state, NULL);
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 8a666fa0..4040b2a6 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -8468,9 +8468,18 @@ sar_load_power_level (MMIfaceModemSar *self,
static gboolean
sar_enable_finish (MMIfaceModemSar *self,
GAsyncResult *res,
+ guint *out_sar_power_level,
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
@@ -8499,6 +8508,7 @@ sar_enable (MMIfaceModemSar *self,
g_autoptr(QmiMessageSarRfSetStateInput) input = NULL;
GTask *task;
QmiClient *client = NULL;
+ QmiSarRfState level;
if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
QMI_SERVICE_SAR, &client,
@@ -8507,9 +8517,10 @@ sar_enable (MMIfaceModemSar *self,
task = g_task_new (self, NULL, callback, user_data);
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,
- NULL);
+
+ level = enable ? QMI_SAR_ENABLE_POWER_INDEX : QMI_SAR_DISABLED_POWER_INDEX;
+ 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 (client),
diff --git a/src/mm-iface-modem-sar.c b/src/mm-iface-modem-sar.c
index 84a04969..63105d63 100644
--- a/src/mm-iface-modem-sar.c
+++ b/src/mm-iface-modem-sar.c
@@ -78,12 +78,15 @@ enable_ready (MMIfaceModemSar *self,
HandleEnableContext *ctx)
{
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);
else {
/* Update current features in the interface */
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);
}
diff --git a/src/mm-iface-modem-sar.h b/src/mm-iface-modem-sar.h
index 633ccdfc..e6518f18 100644
--- a/src/mm-iface-modem-sar.h
+++ b/src/mm-iface-modem-sar.h
@@ -48,6 +48,7 @@ struct _MMIfaceModemSar {
gpointer user_data);
gboolean (* enable_finish) (MMIfaceModemSar *self,
GAsyncResult *res,
+ guint *out_sar_power_level,
GError **error);
/* Get SAR state (async) */
void (* load_state) (MMIfaceModemSar *self,