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:

committed by
Aleksander Morgado

parent
950d36d4ee
commit
1ea5a577e3
@@ -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);
|
||||||
|
@@ -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),
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user