summaryrefslogtreecommitdiff
path: root/src/mbimcli
diff options
context:
space:
mode:
authorSom_SP <somashekhar.puttagangaiah@intel.com>2021-10-01 20:39:14 +0530
committerAleksander Morgado <aleksander@aleksander.es>2021-10-25 12:48:51 +0200
commitee9eea63160664c4e28ae73e112ca582f0c4621f (patch)
tree7d1bb9aa4af0f4332390ca2f78333af58528ae55 /src/mbimcli
parent9eb738c0d632112daad3a5575de0b58d58bd94b2 (diff)
downloadlibmbim-ee9eea63160664c4e28ae73e112ca582f0c4621f.tar.gz
ms-basic-connect-extensions: implement wake-reason
This CID is used by host to query the modem for its wake reason when power up because of device wake. If the device supports this function, but fails the query from host, it means the power up is not caused by a wake from the device. Includes updates by Aleksander Morgado to fix coding style issues, message definitions add missing documentation items.
Diffstat (limited to 'src/mbimcli')
-rw-r--r--src/mbimcli/mbimcli-ms-basic-connect-extensions.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/mbimcli/mbimcli-ms-basic-connect-extensions.c b/src/mbimcli/mbimcli-ms-basic-connect-extensions.c
index cf4564b..e7cbe62 100644
--- a/src/mbimcli/mbimcli-ms-basic-connect-extensions.c
+++ b/src/mbimcli/mbimcli-ms-basic-connect-extensions.c
@@ -49,6 +49,7 @@ static gchar *query_version_str;
static gboolean query_registration_parameters_flag;
static gchar *set_registration_parameters_str;
static gboolean query_modem_configuration_flag;
+static gboolean query_wake_reason_flag;
static gboolean query_pco_arg_parse (const gchar *option_name,
const gchar *value,
@@ -125,7 +126,11 @@ static GOptionEntry entries[] = {
"Query modem configuration. Since MBIMEx v3.0.",
NULL
},
- { NULL }
+ { "ms-query-wake-reason", 0, 0, G_OPTION_ARG_NONE, &query_wake_reason_flag,
+ "Query wake reason. Since MBIMEx v3.0.",
+ NULL
+ },
+ {NULL }
};
static gboolean
@@ -208,7 +213,8 @@ mbimcli_ms_basic_connect_extensions_options_enabled (void)
!!query_version_str +
query_registration_parameters_flag +
!!set_registration_parameters_str +
- query_modem_configuration_flag);
+ query_modem_configuration_flag +
+ query_wake_reason_flag);
if (n_actions > 1) {
g_printerr ("error: too many Microsoft Basic Connect Extensions Service actions requested\n");
@@ -1534,6 +1540,48 @@ query_modem_configuration_ready (MbimDevice *device,
shutdown (TRUE);
}
+static void
+query_wake_reason_ready (MbimDevice *device,
+ GAsyncResult *res)
+{
+ g_autoptr(MbimMessage) response = NULL;
+ g_autoptr(GError) error = NULL;
+ MbimWakeType wake_type;
+ guint32 session_id;
+ const guint8 *data_buffer;
+ guint32 data_buffer_size;
+ g_autofree gchar *data_buffer_str = NULL;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
+ g_printerr ("error: operation failed: %s\n", error->message);
+ shutdown (FALSE);
+ return;
+ }
+
+ if (!mbim_message_ms_basic_connect_extensions_v3_wake_reason_response_parse (
+ response,
+ &wake_type,
+ &session_id,
+ &data_buffer_size,
+ &data_buffer,
+ &error)) {
+ g_printerr ("error: couldn't parse response message: %s\n", error->message);
+ shutdown (FALSE);
+ return;
+ }
+
+ g_print ("[%s] Successfully queried wake reason\n",
+ mbim_device_get_path_display (device));
+
+ data_buffer_str = mbim_common_str_hex (data_buffer, data_buffer_size, ':');
+ g_print ("\t Wake type: '%s'\n", mbim_wake_type_get_string (wake_type));
+ g_print ("\t Session ID: '%u'\n", session_id);
+ g_print ("\tData buffer: '%s'\n", data_buffer_str);
+
+ shutdown (TRUE);
+}
+
void
mbimcli_ms_basic_connect_extensions_run (MbimDevice *device,
GCancellable *cancellable)
@@ -1900,5 +1948,18 @@ mbimcli_ms_basic_connect_extensions_run (MbimDevice *device,
return;
}
+ /* Request to query Wake Reason? */
+ if (query_wake_reason_flag) {
+ g_debug ("Asynchronously querying wake reason...");
+ request = mbim_message_ms_basic_connect_extensions_v3_wake_reason_query_new (NULL);
+ mbim_device_command (ctx->device,
+ request,
+ 10,
+ ctx->cancellable,
+ (GAsyncReadyCallback)query_wake_reason_ready,
+ NULL);
+ return;
+ }
+
g_warn_if_reached ();
}