[PATCH] dms: new 'Swi Get/Set USB Composition' messages

Aleksander Morgado aleksander at aleksander.es
Thu Oct 19 14:14:35 UTC 2017


And corresponding '--dms-swi-get-usb-composition' and
'--dms-swi-set-usb-composition=[x]' qmicli actions.

Based on Bjørn Mork's swi_setusbcomp.pl tool:
https://git.mork.no/?p=wwan.git;a=blob_plain;f=scripts/swi_setusbcomp.pl

    $ sudo qmicli -d /dev/cdc-wdm2 --dms-swi-get-usb-composition
    [/dev/cdc-wdm2] Successfully retrieved USB compositions:
    	    USB composition 6: DM, NMEA, AT, QMI
    	[*] USB composition 8: DM, NMEA, AT, MBIM
    	    USB composition 9: MBIM

    $ sudo qmicli -d /dev/cdc-wdm2 --dms-swi-set-usb-composition=9
    [/dev/cdc-wdm2] Successfully set USB composition

    	You may want to power-cycle the modem now, or just set it offline and reset it:
    		$> sudo qmicli ... --dms-set-operating-mode=offline
    		$> sudo qmicli ... --dms-set-operating-mode=reset

    $ sudo qmicli -d /dev/cdc-wdm2 --dms-set-operating-mode=offline
    [/dev/cdc-wdm2] Operating mode set successfully

    $ sudo qmicli -d /dev/cdc-wdm2 --dms-set-operating-mode=reset
    [/dev/cdc-wdm2] Operating mode set successfully

    (module reboots)

    $ sudo qmicli -d /dev/cdc-wdm2 --dms-swi-get-usb-composition
    [/dev/cdc-wdm2] Successfully retrieved USB compositions:
    	    USB composition 6: DM, NMEA, AT, QMI
    	    USB composition 8: DM, NMEA, AT, MBIM
    	[*] USB composition 9: MBIM
---
 data/qmi-service-dms.json                          |  43 ++++++
 .../libqmi-glib/libqmi-glib-common.sections        |   6 +
 docs/reference/libqmi-glib/libqmi-glib-docs.xml    |   2 +
 src/libqmi-glib/Makefile.am                        |   2 +-
 src/libqmi-glib/qmi-enums-dms.c                    |  59 ++++++++
 src/libqmi-glib/qmi-enums-dms.h                    |  80 +++++++++++
 src/qmicli/qmicli-dms.c                            | 155 +++++++++++++++++++++
 src/qmicli/qmicli-helpers.c                        |  21 +++
 src/qmicli/qmicli-helpers.h                        |   2 +
 9 files changed, 369 insertions(+), 1 deletion(-)
 create mode 100644 src/libqmi-glib/qmi-enums-dms.c

diff --git a/data/qmi-service-dms.json b/data/qmi-service-dms.json
index 38ce16b..72ebb6e 100644
--- a/data/qmi-service-dms.json
+++ b/data/qmi-service-dms.json
@@ -1462,6 +1462,49 @@
                      "format"        : "string",
                      "prerequisites" : [ { "common-ref" : "Success" } ] } ] },
 
+  // *********************************************************************************
+  {  "name"    : "Swi Get USB Composition",
+     "type"    : "Message",
+     "service" : "DMS",
+     "id"      : "0x555B",
+     "vendor"  : "0x1199",
+     "since"   : "1.20",
+     "output"  : [ { "common-ref" : "Operation Result" },
+                   { "name"          : "Current",
+                     "id"            : "0x10",
+                     "mandatory"     : "no",
+                     "type"          : "TLV",
+                     "since"         : "1.20",
+                     "format"        : "guint8",
+                     "public-format" : "QmiDmsSwiUsbComposition",
+                     "prerequisites" : [ { "common-ref" : "Success" } ] },
+                   { "name"          : "Supported",
+                     "id"            : "0x11",
+                     "mandatory"     : "no",
+                     "type"          : "TLV",
+                     "since"         : "1.20",
+                     "format"        : "array",
+                     "array-element" : { "format"        : "guint8",
+                                         "public-format" : "QmiDmsSwiUsbComposition" },
+                     "prerequisites" : [ { "common-ref" : "Success" } ] } ] },
+
+  // *********************************************************************************
+  {  "name"    : "Swi Set USB Composition",
+     "type"    : "Message",
+     "service" : "DMS",
+     "id"      : "0x555C",
+     "vendor"  : "0x1199",
+     "since"   : "1.20",
+     "input"   : [ { "name"          : "Current",
+                     "id"            : "0x01",
+                     "mandatory"     : "yes",
+                     "type"          : "TLV",
+                     "since"         : "1.20",
+                     "format"        : "guint8",
+                     "public-format" : "QmiDmsSwiUsbComposition"
+                   } ],
+     "output"  : [ { "common-ref" : "Operation Result" } ] },
+
   // *********************************************************************************
   {  "name"    : "Set FCC Authentication",
      "type"    : "Message",
diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
index d194120..6ce1e37 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
+++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
@@ -164,6 +164,7 @@ QmiDmsTimeReferenceType
 QmiDmsFirmwareImageType
 QmiDmsBootImageDownloadMode
 QmiDmsHpDeviceMode
+QmiDmsSwiUsbComposition
 <SUBSECTION Methods>
 qmi_dms_data_service_capability_get_string
 qmi_dms_sim_capability_get_string
@@ -184,6 +185,8 @@ qmi_dms_time_reference_type_get_string
 qmi_dms_firmware_image_type_get_string
 qmi_dms_boot_image_download_mode_get_string
 qmi_dms_hp_device_mode_get_string
+qmi_dms_swi_usb_composition_get_string
+qmi_dms_swi_usb_composition_get_description
 <SUBSECTION Private>
 qmi_dms_data_service_capability_build_string_from_mask
 qmi_dms_sim_capability_build_string_from_mask
@@ -202,6 +205,7 @@ qmi_dms_time_reference_type_build_string_from_mask
 qmi_dms_firmware_image_type_build_string_from_mask
 qmi_dms_boot_image_download_mode_build_string_from_mask
 qmi_dms_hp_device_mode_build_string_from_mask
+qmi_dms_swi_usb_composition_build_string_from_mask
 <SUBSECTION Standard>
 QMI_TYPE_DMS_ACTIVATION_STATE
 QMI_TYPE_DMS_BOOT_IMAGE_DOWNLOAD_MODE
@@ -220,6 +224,7 @@ QMI_TYPE_DMS_UIM_PIN_ID
 QMI_TYPE_DMS_UIM_PIN_STATUS
 QMI_TYPE_DMS_UIM_STATE
 QMI_TYPE_DMS_HP_DEVICE_MODE
+QMI_TYPE_DMS_SWI_USB_COMPOSITION
 qmi_dms_activation_state_get_type
 qmi_dms_boot_image_download_mode_get_type
 qmi_dms_data_service_capability_get_type
@@ -237,6 +242,7 @@ qmi_dms_uim_pin_id_get_type
 qmi_dms_uim_pin_status_get_type
 qmi_dms_uim_state_get_type
 qmi_dms_hp_device_mode_get_type
+qmi_dms_swi_usb_composition_get_type
 </SECTION>
 
 <SECTION>
diff --git a/docs/reference/libqmi-glib/libqmi-glib-docs.xml b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
index 9f1f83f..c636b5b 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-docs.xml
+++ b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
@@ -118,6 +118,8 @@
       <xi:include href="xml/qmi-message-dms-set-service-programming-code.xml"/>
       <xi:include href="xml/qmi-message-dms-hp-change-device-mode.xml"/>
       <xi:include href="xml/qmi-message-dms-swi-get-current-firmware.xml"/>
+      <xi:include href="xml/qmi-message-dms-swi-get-usb-composition.xml"/>
+      <xi:include href="xml/qmi-message-dms-swi-set-usb-composition.xml"/>
       <xi:include href="xml/qmi-message-dms-set-fcc-authentication.xml"/>
       <xi:include href="xml/qmi-message-dms-get-supported-messages.xml"/>
     </section>
diff --git a/src/libqmi-glib/Makefile.am b/src/libqmi-glib/Makefile.am
index 43e60cc..63723b0 100644
--- a/src/libqmi-glib/Makefile.am
+++ b/src/libqmi-glib/Makefile.am
@@ -21,7 +21,7 @@ libqmi_glib_la_SOURCES = \
 	qmi-version.h \
 	qmi-errors.h \
 	qmi-enums-wds.h qmi-enums-wds.c \
-	qmi-enums-dms.h qmi-flags64-dms.h \
+	qmi-enums-dms.h qmi-flags64-dms.h qmi-enums-dms.c \
 	qmi-enums-nas.h qmi-flags64-nas.h\
 	qmi-enums-wms.h \
 	qmi-enums-pds.h \
diff --git a/src/libqmi-glib/qmi-enums-dms.c b/src/libqmi-glib/qmi-enums-dms.c
new file mode 100644
index 0000000..6cff21d
--- /dev/null
+++ b/src/libqmi-glib/qmi-enums-dms.c
@@ -0,0 +1,59 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * libqmi-glib -- GLib/GIO based library to control QMI devices
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2017 Aleksander Morgado <aleksander at aleksander.es>
+ */
+
+#include <glib.h>
+#include "qmi-enums-dms.h"
+
+/*****************************************************************************/
+/* Helper for the 'QMI DMS Swi Get USB Composition' message */
+
+static const gchar *usb_composition_description[] = {
+    [QMI_DMS_SWI_USB_COMPOSITION_0]  = "HIP, DM, NMEA, AT, MDM1, MDM2, MDM3, MS",
+    [QMI_DMS_SWI_USB_COMPOSITION_1]  = "HIP, DM, NMEA, AT, MDM1, MS",
+    [QMI_DMS_SWI_USB_COMPOSITION_2]  = "HIP, DM, NMEA, AT, NIC1, MS",
+    [QMI_DMS_SWI_USB_COMPOSITION_3]  = "HIP, DM, NMEA, AT, MDM1, NIC1, MS",
+    [QMI_DMS_SWI_USB_COMPOSITION_4]  = "HIP, DM, NMEA, AT, NIC1, NIC2, NIC3, MS",
+    [QMI_DMS_SWI_USB_COMPOSITION_5]  = "HIP, DM, NMEA, AT, ECM1, MS",
+    [QMI_DMS_SWI_USB_COMPOSITION_6]  = "DM, NMEA, AT, QMI",
+    [QMI_DMS_SWI_USB_COMPOSITION_7]  = "DM, NMEA, AT, RMNET1, RMNET2, RMNET3",
+    [QMI_DMS_SWI_USB_COMPOSITION_8]  = "DM, NMEA, AT, MBIM",
+    [QMI_DMS_SWI_USB_COMPOSITION_9]  = "MBIM",
+    [QMI_DMS_SWI_USB_COMPOSITION_10] = "NMEA, MBIM",
+    [QMI_DMS_SWI_USB_COMPOSITION_11] = "DM, MBIM",
+    [QMI_DMS_SWI_USB_COMPOSITION_12] = "DM, NMEA, MBIM",
+    [QMI_DMS_SWI_USB_COMPOSITION_13] = "Dual configuration: USB composition 6 and USB composition 8",
+    [QMI_DMS_SWI_USB_COMPOSITION_14] = "Dual configuration: USB composition 6 and USB composition 9",
+    [QMI_DMS_SWI_USB_COMPOSITION_15] = "Dual configuration: USB composition 6 and USB composition 10",
+    [QMI_DMS_SWI_USB_COMPOSITION_16] = "Dual configuration: USB composition 6 and USB composition 11",
+    [QMI_DMS_SWI_USB_COMPOSITION_17] = "Dual configuration: USB composition 6 and USB composition 12",
+    [QMI_DMS_SWI_USB_COMPOSITION_18] = "Dual configuration: USB composition 7 and USB composition 8",
+    [QMI_DMS_SWI_USB_COMPOSITION_19] = "Dual configuration: USB composition 7 and USB composition 9",
+    [QMI_DMS_SWI_USB_COMPOSITION_20] = "Dual configuration: USB composition 7 and USB composition 10",
+    [QMI_DMS_SWI_USB_COMPOSITION_21] = "Dual configuration: USB composition 7 and USB composition 11",
+    [QMI_DMS_SWI_USB_COMPOSITION_22] = "Dual configuration: USB composition 7 and USB composition 12",
+};
+
+const gchar *
+qmi_dms_swi_usb_composition_get_description (QmiDmsSwiUsbComposition value)
+{
+    return ((value > QMI_DMS_SWI_USB_COMPOSITION_UNKNOWN && value < G_N_ELEMENTS (usb_composition_description)) ? usb_composition_description[value] : NULL);
+}
diff --git a/src/libqmi-glib/qmi-enums-dms.h b/src/libqmi-glib/qmi-enums-dms.h
index dcd8aa3..523415e 100644
--- a/src/libqmi-glib/qmi-enums-dms.h
+++ b/src/libqmi-glib/qmi-enums-dms.h
@@ -24,6 +24,8 @@
 #ifndef _LIBQMI_GLIB_QMI_ENUMS_DMS_H_
 #define _LIBQMI_GLIB_QMI_ENUMS_DMS_H_
 
+#include <glib.h>
+
 #if !defined (__LIBQMI_GLIB_H_INSIDE__) && !defined (LIBQMI_GLIB_COMPILATION)
 #error "Only <libqmi-glib.h> can be included directly."
 #endif
@@ -502,4 +504,82 @@ typedef enum {
  * Since: 1.18
  */
 
+/*****************************************************************************/
+/* Helper enums for the 'QMI DMS Swi Get USB Composition' message */
+
+/**
+ * QmiDmsSwiUsbComposition:
+ * @QMI_DMS_SWI_USB_COMPOSITION_UNKNOWN: Unknown.
+ * @QMI_DMS_SWI_USB_COMPOSITION_0: HIP, DM, NMEA, AT, MDM1, MDM2, MDM3, MS.
+ * @QMI_DMS_SWI_USB_COMPOSITION_1: HIP, DM, NMEA, AT, MDM1, MS.
+ * @QMI_DMS_SWI_USB_COMPOSITION_2: HIP, DM, NMEA, AT, NIC1, MS.
+ * @QMI_DMS_SWI_USB_COMPOSITION_3: HIP, DM, NMEA, AT, MDM1, NIC1, MS.
+ * @QMI_DMS_SWI_USB_COMPOSITION_4: HIP, DM, NMEA, AT, NIC1, NIC2, NIC3, MS.
+ * @QMI_DMS_SWI_USB_COMPOSITION_5: HIP, DM, NMEA, AT, ECM1, MS.
+ * @QMI_DMS_SWI_USB_COMPOSITION_6: DM, NMEA, AT, QMI.
+ * @QMI_DMS_SWI_USB_COMPOSITION_7: DM, NMEA, AT, RMNET1, RMNET2, RMNET3.
+ * @QMI_DMS_SWI_USB_COMPOSITION_8: DM, NMEA, AT, MBIM.
+ * @QMI_DMS_SWI_USB_COMPOSITION_9: MBIM.
+ * @QMI_DMS_SWI_USB_COMPOSITION_10: NMEA, MBIM.
+ * @QMI_DMS_SWI_USB_COMPOSITION_11: DM, MBIM.
+ * @QMI_DMS_SWI_USB_COMPOSITION_12: DM, NMEA, MBIM.
+ * @QMI_DMS_SWI_USB_COMPOSITION_13: Dual configuration: USB composition 6 and USB composition 8.
+ * @QMI_DMS_SWI_USB_COMPOSITION_14: Dual configuration: USB composition 6 and USB composition 9.
+ * @QMI_DMS_SWI_USB_COMPOSITION_15: Dual configuration: USB composition 6 and USB composition 10.
+ * @QMI_DMS_SWI_USB_COMPOSITION_16: Dual configuration: USB composition 6 and USB composition 11.
+ * @QMI_DMS_SWI_USB_COMPOSITION_17: Dual configuration: USB composition 6 and USB composition 12.
+ * @QMI_DMS_SWI_USB_COMPOSITION_18: Dual configuration: USB composition 7 and USB composition 8.
+ * @QMI_DMS_SWI_USB_COMPOSITION_19: Dual configuration: USB composition 7 and USB composition 9.
+ * @QMI_DMS_SWI_USB_COMPOSITION_20: Dual configuration: USB composition 7 and USB composition 10.
+ * @QMI_DMS_SWI_USB_COMPOSITION_21: Dual configuration: USB composition 7 and USB composition 11.
+ * @QMI_DMS_SWI_USB_COMPOSITION_22: Dual configuration: USB composition 7 and USB composition 12.
+ *
+ * Sierra Wireless USB composition modes.
+ *
+ * Since: 1.20
+ */
+typedef enum {
+    QMI_DMS_SWI_USB_COMPOSITION_UNKNOWN = -1,
+    QMI_DMS_SWI_USB_COMPOSITION_0  =  0,
+    QMI_DMS_SWI_USB_COMPOSITION_1  =  1,
+    QMI_DMS_SWI_USB_COMPOSITION_2  =  2,
+    QMI_DMS_SWI_USB_COMPOSITION_3  =  3,
+    QMI_DMS_SWI_USB_COMPOSITION_4  =  4,
+    QMI_DMS_SWI_USB_COMPOSITION_5  =  5,
+    QMI_DMS_SWI_USB_COMPOSITION_6  =  6,
+    QMI_DMS_SWI_USB_COMPOSITION_7  =  7,
+    QMI_DMS_SWI_USB_COMPOSITION_8  =  8,
+    QMI_DMS_SWI_USB_COMPOSITION_9  =  9,
+    QMI_DMS_SWI_USB_COMPOSITION_10 = 10,
+    QMI_DMS_SWI_USB_COMPOSITION_11 = 11,
+    QMI_DMS_SWI_USB_COMPOSITION_12 = 12,
+    QMI_DMS_SWI_USB_COMPOSITION_13 = 13,
+    QMI_DMS_SWI_USB_COMPOSITION_14 = 14,
+    QMI_DMS_SWI_USB_COMPOSITION_15 = 15,
+    QMI_DMS_SWI_USB_COMPOSITION_16 = 16,
+    QMI_DMS_SWI_USB_COMPOSITION_17 = 17,
+    QMI_DMS_SWI_USB_COMPOSITION_18 = 18,
+    QMI_DMS_SWI_USB_COMPOSITION_19 = 19,
+    QMI_DMS_SWI_USB_COMPOSITION_20 = 20,
+    QMI_DMS_SWI_USB_COMPOSITION_21 = 21,
+    QMI_DMS_SWI_USB_COMPOSITION_22 = 22,
+} QmiDmsSwiUsbComposition;
+
+/**
+ * qmi_dms_swi_usb_composition_get_description:
+ * @value: a #QmiDmsSwiUsbComposition.
+ *
+ * Gets a text description of the Sierra Wireless USB composition.
+ *
+ * Since: 1.20
+ * Returns: a string.
+ */
+const gchar *qmi_dms_swi_usb_composition_get_description (QmiDmsSwiUsbComposition value);
+
+/**
+ * qmi_dms_swi_usb_composition_get_string:
+ *
+ * Since: 1.20
+ */
+
 #endif /* _LIBQMI_GLIB_QMI_ENUMS_DMS_H_ */
diff --git a/src/qmicli/qmicli-dms.c b/src/qmicli/qmicli-dms.c
index bc1fde5..46b684b 100644
--- a/src/qmicli/qmicli-dms.c
+++ b/src/qmicli/qmicli-dms.c
@@ -94,6 +94,8 @@ static gboolean set_fcc_authentication_flag;
 static gboolean get_supported_messages_flag;
 static gchar *hp_change_device_mode_str;
 static gboolean swi_get_current_firmware_flag;
+static gboolean swi_get_usb_composition_flag;
+static gchar *swi_set_usb_composition_str;
 static gboolean reset_flag;
 static gboolean noop_flag;
 
@@ -294,6 +296,14 @@ static GOptionEntry entries[] = {
       "Get Current Firmware (Sierra Wireless specific)",
       NULL
     },
+    { "dms-swi-get-usb-composition", 0, 0, G_OPTION_ARG_NONE, &swi_get_usb_composition_flag,
+      "Get current and supported USB compositions (Sierra Wireless specific)",
+      NULL
+    },
+    { "dms-swi-set-usb-composition", 0, 0, G_OPTION_ARG_STRING, &swi_set_usb_composition_str,
+      "Set USB composition (Sierra Wireless specific)",
+      "[#]"
+    },
     { "dms-reset", 0, 0, G_OPTION_ARG_NONE, &reset_flag,
       "Reset the service state",
       NULL
@@ -378,6 +388,8 @@ qmicli_dms_options_enabled (void)
                  get_supported_messages_flag +
                  !!hp_change_device_mode_str +
                  swi_get_current_firmware_flag +
+                 swi_get_usb_composition_flag +
+                 !!swi_set_usb_composition_str +
                  reset_flag +
                  noop_flag);
 
@@ -3513,6 +3525,115 @@ swi_get_current_firmware_ready (QmiClientDms *client,
     operation_shutdown (TRUE);
 }
 
+static void
+swi_get_usb_composition_ready (QmiClientDms *client,
+                               GAsyncResult *res)
+{
+    QmiMessageDmsSwiGetUsbCompositionOutput *output;
+    GError                                  *error = NULL;
+    GArray                                  *supported = NULL;
+    QmiDmsSwiUsbComposition                  current = QMI_DMS_SWI_USB_COMPOSITION_UNKNOWN;
+    guint                                    i;
+
+    output = qmi_client_dms_swi_get_usb_composition_finish (client, res, &error);
+    if (!output) {
+        g_printerr ("error: operation failed: %s\n", error->message);
+        g_error_free (error);
+        operation_shutdown (FALSE);
+        return;
+    }
+
+    if (!qmi_message_dms_swi_get_usb_composition_output_get_result (output, &error)) {
+        g_printerr ("error: couldn't get USB composite modes: %s\n", error->message);
+        g_error_free (error);
+        qmi_message_dms_swi_get_usb_composition_output_unref (output);
+        operation_shutdown (FALSE);
+        return;
+    }
+
+    g_print ("[%s] Successfully retrieved USB compositions:\n",
+             qmi_device_get_path_display (ctx->device));
+
+    if (!qmi_message_dms_swi_get_usb_composition_output_get_current (output, &current, &error)) {
+        g_printerr ("error: couldn't get current USB composition: %s\n", error->message);
+        g_clear_error (&error);
+    }
+
+    if (!qmi_message_dms_swi_get_usb_composition_output_get_supported (output, &supported, &error)) {
+        g_printerr ("error: couldn't get list of USB compositions: %s\n", error->message);
+        g_clear_error (&error);
+    }
+
+    for (i = 0; i < supported->len; i++) {
+        QmiDmsSwiUsbComposition value;
+
+        value = g_array_index (supported, QmiDmsSwiUsbComposition, i);
+        g_print ("\t%sUSB composition %s: %s\n",
+                 (value == current ? "[*] " : "    "),
+                 qmi_dms_swi_usb_composition_get_string (value),
+                 qmi_dms_swi_usb_composition_get_description (value));
+    }
+
+    qmi_message_dms_swi_get_usb_composition_output_unref (output);
+    operation_shutdown (TRUE);
+}
+
+static void
+swi_set_usb_composition_ready (QmiClientDms *client,
+                               GAsyncResult *res)
+{
+    QmiMessageDmsSwiSetUsbCompositionOutput *output;
+    GError                                  *error = NULL;
+
+    output = qmi_client_dms_swi_set_usb_composition_finish (client, res, &error);
+    if (!output) {
+        g_printerr ("error: operation failed: %s\n", error->message);
+        g_error_free (error);
+        operation_shutdown (FALSE);
+        return;
+    }
+
+    if (!qmi_message_dms_swi_set_usb_composition_output_get_result (output, &error)) {
+        g_printerr ("error: couldn't set USB composite modes: %s\n", error->message);
+        g_error_free (error);
+        qmi_message_dms_swi_set_usb_composition_output_unref (output);
+        operation_shutdown (FALSE);
+        return;
+    }
+
+    g_print ("[%s] Successfully set USB composition\n"
+             "\n"
+             "\tYou may want to power-cycle the modem now, or just set it offline and reset it:\n"
+             "\t\t$> sudo qmicli ... --dms-set-operating-mode=offline\n"
+             "\t\t$> sudo qmicli ... --dms-set-operating-mode=reset\n"
+             "\n",
+             qmi_device_get_path_display (ctx->device));
+
+    qmi_message_dms_swi_set_usb_composition_output_unref (output);
+    operation_shutdown (TRUE);
+}
+
+static QmiMessageDmsSwiSetUsbCompositionInput *
+swi_set_usb_composition_input_create (const gchar *str)
+{
+    QmiMessageDmsSwiSetUsbCompositionInput *input = NULL;
+    QmiDmsSwiUsbComposition value;
+    GError *error = NULL;
+
+    if (!qmicli_read_swi_usb_composition_from_string (str, &value))
+        return NULL;
+
+    input = qmi_message_dms_swi_set_usb_composition_input_new ();
+    if (!qmi_message_dms_swi_set_usb_composition_input_set_current (input, value, &error)) {
+        g_printerr ("error: couldn't create input bundle: '%s'\n", error->message);
+        g_error_free (error);
+        qmi_message_dms_swi_set_usb_composition_input_unref (input);
+        return NULL;
+    }
+
+    return input;
+}
+
 static void
 reset_ready (QmiClientDms *client,
              GAsyncResult *res)
@@ -4298,6 +4419,40 @@ qmicli_dms_run (QmiDevice *device,
         return;
     }
 
+    /* Request to get current USB composition */
+    if (swi_get_usb_composition_flag) {
+        g_debug ("Asynchronously getting USB compositionss (Sierra Wireless specific)...");
+        qmi_client_dms_swi_get_usb_composition (ctx->client,
+                                                NULL,
+                                                10,
+                                                ctx->cancellable,
+                                                (GAsyncReadyCallback)swi_get_usb_composition_ready,
+                                                NULL);
+        return;
+    }
+
+    /* Request to set current USB composition */
+    if (swi_set_usb_composition_str) {
+        QmiMessageDmsSwiSetUsbCompositionInput *input;
+
+        g_debug ("Asynchronously setting USB composition (Sierra Wireless specific)...");
+
+        input = swi_set_usb_composition_input_create (swi_set_usb_composition_str);
+        if (!input) {
+            operation_shutdown (FALSE);
+            return;
+        }
+
+        qmi_client_dms_swi_set_usb_composition  (ctx->client,
+                                                 input,
+                                                 10,
+                                                 ctx->cancellable,
+                                                 (GAsyncReadyCallback)swi_set_usb_composition_ready,
+                                              NULL);
+        qmi_message_dms_swi_set_usb_composition_input_unref (input);
+        return;
+    }
+
     /* Request to reset DMS service? */
     if (reset_flag) {
         g_debug ("Asynchronously resetting DMS service...");
diff --git a/src/qmicli/qmicli-helpers.c b/src/qmicli/qmicli-helpers.c
index 0711253..00f7122 100644
--- a/src/qmicli/qmicli-helpers.c
+++ b/src/qmicli/qmicli-helpers.c
@@ -690,6 +690,27 @@ qmicli_read_hp_device_mode_from_string (const gchar *str,
     return !!enum_value;
 }
 
+gboolean
+qmicli_read_swi_usb_composition_from_string (const gchar *str,
+                                             QmiDmsSwiUsbComposition *out)
+{
+    GType type;
+    GEnumClass *enum_class;
+    GEnumValue *enum_value;
+
+    type = qmi_dms_swi_usb_composition_get_type ();
+    enum_class = G_ENUM_CLASS (g_type_class_ref (type));
+    enum_value = g_enum_get_value_by_nick (enum_class, str);
+
+    if (enum_value)
+        *out = (QmiDmsSwiUsbComposition)enum_value->value;
+    else
+        g_printerr ("error: invalid SWI USB Composition value given: '%s'\n", str);
+
+    g_type_class_unref (enum_class);
+    return !!enum_value;
+}
+
 gboolean
 qmicli_read_uint_from_string (const gchar *str,
                               guint *out)
diff --git a/src/qmicli/qmicli-helpers.h b/src/qmicli/qmicli-helpers.h
index 3ae880b..e8fac1d 100644
--- a/src/qmicli/qmicli-helpers.h
+++ b/src/qmicli/qmicli-helpers.h
@@ -73,6 +73,8 @@ gboolean qmicli_read_boot_image_download_mode_from_string    (const gchar *str,
                                                               QmiDmsBootImageDownloadMode *out);
 gboolean qmicli_read_hp_device_mode_from_string              (const gchar *str,
                                                               QmiDmsHpDeviceMode *out);
+gboolean qmicli_read_swi_usb_composition_from_string         (const gchar *str,
+                                                              QmiDmsSwiUsbComposition *out);
 
 gboolean qmicli_read_non_empty_string           (const gchar *str,
                                                  const gchar *description,
-- 
2.14.1



More information about the libqmi-devel mailing list