[PATCH] nas: Implement vendor specific "Swi Get Status"

Dan Williams dcbw at redhat.com
Wed Aug 21 21:29:52 UTC 2019


On Tue, 2019-08-20 at 12:19 +0200, Bjørn Mork wrote:
> This Sierra Wireless (swi) specific request returns some of the
> system
> info known from the swi specific AT command "!GSTATUS?".

Thanks, submitted as an MR here:

https://gitlab.freedesktop.org/mobile-broadband/libqmi/merge_requests/62

Dan

> [/dev/cdc-wdm0] Successfully got status:
> Common Info:
>         Temperature: '32'
>         Modem mode: 'online'
>         System mode: 'lte'
>         IMS registration state: 'no-srv'
>         Packet service state: 'attached'
> LTE info:
>         Band: 'bc-3'
>         Bandwidth: '20'
>         RX channel: '1450'
>         TX channel: '19450'
>         EMM state: 'registered'
>         EMM sub state: '0'
>         EMM connection state: 'rrc-connecting'
> 
> Signed-off-by: Bjørn Mork <bjorn at mork.no>
> ---
>  data/qmi-service-nas.json       |  56 ++++++++++++-
>  src/libqmi-glib/qmi-enums-nas.h | 138
> ++++++++++++++++++++++++++++++++
>  src/qmicli/qmicli-nas.c         | 110 +++++++++++++++++++++++++
>  3 files changed, 303 insertions(+), 1 deletion(-)
> 
> diff --git a/data/qmi-service-nas.json b/data/qmi-service-nas.json
> index 1c5ab545a5e2..07763a16d4bc 100644
> --- a/data/qmi-service-nas.json
> +++ b/data/qmi-service-nas.json
> @@ -3579,5 +3579,59 @@
>                                                                  "pub
> lic-format" : "QmiNasScellState" },
>  				                              {
> "name"          : "Cell Index",
>                                                                  "for
> mat"        : "guint8" } ] },
> -                     "prerequisites"      : [ { "common-ref" :
> "Success" } ] } ] }
> +                     "prerequisites"      : [ { "common-ref" :
> "Success" } ] } ] },
> +
> +  //
> *********************************************************************
> ************
> +  {  "name"    : "Swi Get Status",
> +     "type"    : "Message",
> +     "service" : "NAS",
> +     "id"      : "0x5556",
> +     "vendor"  : "0x1199",
> +     "since"   : "1.20",
> +     "output"  : [ { "common-ref" : "Operation Result" },
> +                   { "name"       : "Common Info",
> +                     "id"         : "0x01",
> +                     "type"       : "TLV",
> +                     "since"      : "1.20",
> +                     "format"     : "sequence",
> +                     "contents"   : [ { "name"   : "Temperature",
> +                                        "format" : "guint8"},
> +                                      { "name"          : "Modem
> Mode",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasSwiModemMode"},
> +                                      { "name"          : "System
> Mode",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasSwiSystemMode"},
> +                                      { "name"          : "IMS
> Registration State",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasSwiImsRegState"},
> +                                      { "name"          : "Packet
> Service State",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasSwiPsState" } ],
> +                     "prerequisites" : [ { "common-ref" : "Success"
> } ] },
> +                   { "name"       : "LTE Info",
> +                     "id"         : "0x10",
> +                     "type"       : "TLV",
> +                     "since"      : "1.20",
> +                     "format"     : "sequence",
> +                     "contents"   : [ { "name"          : "Band",
> +                                        "format"        : "guint8",
> +                                        "public-format" :
> "QmiNasActiveBand" },
> +                                      { "name"          :
> "Bandwidth",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasDLBandwidth"},
> +                                      { "name"          : "RX
> Channel",
> +                                        "format"        : "guint16"
> },
> +                                      { "name"          : "TX
> Channel",
> +                                        "format"        : "guint16"
> },
> +                                      { "name"          : "EMM
> State",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasSwiEmmState"},
> +                                      { "name"          : "EMM Sub
> State",
> +                                        "format"        : "guint8"
> },
> +                                      { "name"          : "EMM
> Connection State",
> +                                        "format"        : "guint8",
> +				        "public-format" :
> "QmiNasSwiEmmConnectionState" } ],
> +                     "prerequisites" : [ { "common-ref" : "Success"
> } ] } ] }
> +
>  ]
> diff --git a/src/libqmi-glib/qmi-enums-nas.h b/src/libqmi-glib/qmi-
> enums-nas.h
> index 4f7f2544e8ca..b30e2efb8827 100644
> --- a/src/libqmi-glib/qmi-enums-nas.h
> +++ b/src/libqmi-glib/qmi-enums-nas.h
> @@ -1525,4 +1525,142 @@ typedef enum {
>      QMI_NAS_USAGE_PREFERENCE_DATA_CENTRIC  = 0x02
>  } QmiNasUsagePreference;
>  
> +/**
> + * QmiNasSwiModemMode:
> + * @QMI_NAS_SWI_MODEM_MODE_POWERING_OFF: Powering off
> + * @QMI_NAS_SWI_MODEM_MODE_FACTORY_TEST: Factory test
> + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE: Offline
> + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE_AMPS: Offline AMPS
> + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE_CDMA: Offline CDMA
> + * @QMI_NAS_SWI_MODEM_MODE_ONLINE: Online
> + * @QMI_NAS_SWI_MODEM_MODE_LOW_POWER: Low power
> + * @QMI_NAS_SWI_MODEM_MODE_RESETTING: Resetting
> + * @QMI_NAS_SWI_MODEM_MODE_NETWORK_TEST: Network test
> + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE_REQUEST: Offline request
> + * @QMI_NAS_SWI_MODEM_MODE_PSEUDO_ONLINE: Pseudo online
> + * @QMI_NAS_SWI_MODEM_MODE_RESETTING_MODEM: Resetting modem
> + * @QMI_NAS_SWI_MODEM_MODE_UNKNOWN: Unknown
> + *
> + * Since: 1.20
> + */
> +typedef enum {
> +    QMI_NAS_SWI_MODEM_MODE_POWERING_OFF    = 0x00,
> +    QMI_NAS_SWI_MODEM_MODE_FACTORY_TEST    = 0x01,
> +    QMI_NAS_SWI_MODEM_MODE_OFFLINE         = 0x02,
> +    QMI_NAS_SWI_MODEM_MODE_OFFLINE_AMPS    = 0x03,
> +    QMI_NAS_SWI_MODEM_MODE_OFFLINE_CDMA    = 0x04,
> +    QMI_NAS_SWI_MODEM_MODE_ONLINE          = 0x05,
> +    QMI_NAS_SWI_MODEM_MODE_LOW_POWER       = 0x06,
> +    QMI_NAS_SWI_MODEM_MODE_RESETTING       = 0x07,
> +    QMI_NAS_SWI_MODEM_MODE_NETWORK_TEST    = 0x08,
> +    QMI_NAS_SWI_MODEM_MODE_OFFLINE_REQUEST = 0x09,
> +    QMI_NAS_SWI_MODEM_MODE_PSEUDO_ONLINE   = 0x0a,
> +    QMI_NAS_SWI_MODEM_MODE_RESETTING_MODEM = 0x0b,
> +    QMI_NAS_SWI_MODEM_MODE_UNKNOWN         = 0xff
> +} QmiNasSwiModemMode;
> +
> +/**
> + * QmiNasSwiSystemMode:
> + * @QMI_NAS_SWI_SYSTEM_MODE_NO_SERVICE: No service
> + * @QMI_NAS_SWI_SYSTEM_MODE_AMPS: AMPS
> + * @QMI_NAS_SWI_SYSTEM_MODE_CDMA: CDMA
> + * @QMI_NAS_SWI_SYSTEM_MODE_GSM: GSM
> + * @QMI_NAS_SWI_SYSTEM_MODE_HDR: HDR
> + * @QMI_NAS_SWI_SYSTEM_MODE_WCDMA: WCDMA
> + * @QMI_NAS_SWI_SYSTEM_MODE_GPS: GPS
> + * @QMI_NAS_SWI_SYSTEM_MODE_WLAN: WLAN
> + * @QMI_NAS_SWI_SYSTEM_MODE_LTE: LTE
> + * @QMI_NAS_SWI_SYSTEM_MODE_UNKNOWN: Unknown
> + *
> + * Since: 1.20
> + */
> +typedef enum {
> +    QMI_NAS_SWI_SYSTEM_MODE_NO_SERVICE = 0x00,
> +    QMI_NAS_SWI_SYSTEM_MODE_AMPS       = 0x01,
> +    QMI_NAS_SWI_SYSTEM_MODE_CDMA       = 0x02,
> +    QMI_NAS_SWI_SYSTEM_MODE_GSM        = 0x03,
> +    QMI_NAS_SWI_SYSTEM_MODE_HDR        = 0x04,
> +    QMI_NAS_SWI_SYSTEM_MODE_WCDMA      = 0x05,
> +    QMI_NAS_SWI_SYSTEM_MODE_GPS        = 0x06,
> +    QMI_NAS_SWI_SYSTEM_MODE_WLAN       = 0x08,
> +    QMI_NAS_SWI_SYSTEM_MODE_LTE        = 0x09,
> +    QMI_NAS_SWI_SYSTEM_MODE_UNKNOWN    = 0xff
> +} QmiNasSwiSystemMode;
> +
> +/**
> + * QmiNasSwiImsRegState:
> + * @QMI_NAS_SWI_IMS_REG_NO_SRV: No service
> + * @QMI_NAS_SWI_IMS_REG_IN_PROG: In prog
> + * @QMI_NAS_SWI_IMS_REG_FAILED: Failed
> + * @QMI_NAS_SWI_IMS_REG_LIMITED: Limited
> + * @QMI_NAS_SWI_IMS_REG_FULL_SRV: Full service
> + * @QMI_NAS_SWI_IMS_REG__UNKNOWN: Unknown
> + *
> + * Since: 1.20
> + */
> +typedef enum {
> +    QMI_NAS_SWI_IMS_REG_NO_SRV   = 0x00,
> +    QMI_NAS_SWI_IMS_REG_IN_PROG  = 0x01,
> +    QMI_NAS_SWI_IMS_REG_FAILED   = 0x02,
> +    QMI_NAS_SWI_IMS_REG_LIMITED  = 0x03,
> +    QMI_NAS_SWI_IMS_REG_FULL_SRV = 0x04,
> +    QMI_NAS_SWI_IMS_REG__UNKNOWN = 0xff
> +} QmiNasSwiImsRegState;
> +
> +/**
> + * QmiNasSwiPsState:
> + * @QMI_NAS_SWI_PS_STATE_ATTACHED: Attached
> + * @QMI_NAS_SWI_PS_STATE_DETACHED: Detached
> + * @QMI_NAS_SWI_PS_STATE_UNKNOWN: Unknown
> + *
> + * Since: 1.20
> + */
> +typedef enum {
> +    QMI_NAS_SWI_PS_STATE_ATTACHED = 0x00,
> +    QMI_NAS_SWI_PS_STATE_DETACHED = 0x01,
> +    QMI_NAS_SWI_PS_STATE_UNKNOWN  = 0xff
> +} QmiNasSwiPsState;
> +
> +/**
> + * QmiNasSwiEmmState:
> + * @QMI_NAS_SWI_EMM_STATE_DEREGISTERED: Deregistered
> + * @QMI_NAS_SWI_EMM_STATE_REG_INITIATED: Registration initiated
> + * @QMI_NAS_SWI_EMM_STATE_REGISTERED: Registered
> + * @QMI_NAS_SWI_EMM_STATE_TAU_INITIATED: TAU initiated
> + * @QMI_NAS_SWI_EMM_STATE_SR_INITIATED: SR initiated
> + * @QMI_NAS_SWI_EMM_STATE_DEREG_INITIATED: Deregistration initiated
> + * @QMI_NAS_SWI_EMM_STATE_INVALID: Invalid
> + * @QMI_NAS_SWI_EMM_STATE_UNKNOWN: Unknown
> + *
> + * Since: 1.20
> + */
> +typedef enum {
> +    QMI_NAS_SWI_EMM_STATE_DEREGISTERED    = 0x00,
> +    QMI_NAS_SWI_EMM_STATE_REG_INITIATED   = 0x01,
> +    QMI_NAS_SWI_EMM_STATE_REGISTERED      = 0x02,
> +    QMI_NAS_SWI_EMM_STATE_TAU_INITIATED   = 0x03,
> +    QMI_NAS_SWI_EMM_STATE_SR_INITIATED    = 0x04,
> +    QMI_NAS_SWI_EMM_STATE_DEREG_INITIATED = 0x05,
> +    QMI_NAS_SWI_EMM_STATE_INVALID         = 0x06,
> +    QMI_NAS_SWI_EMM_STATE_UNKNOWN         = 0xff
> +} QmiNasSwiEmmState;
> +
> +/**
> + * QmiNasSwiEmmConnectionState:
> + * @QMI_NAS_SWI_EMM_CONN_STATE_RRC_IDLE: RRC idle
> + * @QMI_NAS_SWI_EMM_CONN_STATE_WAITING_RRC_CFM: Waiting RRC Cfm
> + * @QMI_NAS_SWI_EMM_CONN_STATE_RRC_CONNECTING: RRC connecting
> + * @QMI_NAS_SWI_EMM_CONN_STATE_RRC_RELEASING: RRC releasing
> + * @QMI_NAS_SWI_EMM_CONN_STATE_UNKNOWN: Unknown
> + *
> + * Since: 1.20
> + */
> +typedef enum {
> +    QMI_NAS_SWI_EMM_CONN_STATE_RRC_IDLE        = 0x00,
> +    QMI_NAS_SWI_EMM_CONN_STATE_WAITING_RRC_CFM = 0x01,
> +    QMI_NAS_SWI_EMM_CONN_STATE_RRC_CONNECTING  = 0x02,
> +    QMI_NAS_SWI_EMM_CONN_STATE_RRC_RELEASING   = 0x03,
> +    QMI_NAS_SWI_EMM_CONN_STATE_UNKNOWN  = 0xff
> +} QmiNasSwiEmmConnectionState;
> +
>  #endif /* _LIBQMI_GLIB_QMI_ENUMS_NAS_H_ */
> diff --git a/src/qmicli/qmicli-nas.c b/src/qmicli/qmicli-nas.c
> index caf5609050a9..527f327f066f 100644
> --- a/src/qmicli/qmicli-nas.c
> +++ b/src/qmicli/qmicli-nas.c
> @@ -59,6 +59,7 @@ static gboolean get_operator_name_flag;
>  static gboolean get_lte_cphy_ca_info_flag;
>  static gboolean get_rf_band_info_flag;
>  static gboolean get_supported_messages_flag;
> +static gboolean swi_get_status_flag;
>  static gboolean reset_flag;
>  static gboolean noop_flag;
>  
> @@ -127,6 +128,10 @@ static GOptionEntry entries[] = {
>        "Get supported messages",
>        NULL
>      },
> +    { "nas-swi-get-status", 0, 0, G_OPTION_ARG_NONE,
> &swi_get_status_flag,
> +      "Get status ((Sierra Wireless specific)",
> +      NULL
> +    },
>      { "nas-reset", 0, 0, G_OPTION_ARG_NONE, &reset_flag,
>        "Reset the service state",
>        NULL
> @@ -178,6 +183,7 @@ qmicli_nas_options_enabled (void)
>                   get_lte_cphy_ca_info_flag +
>                   get_rf_band_info_flag +
>                   get_supported_messages_flag +
> +                 swi_get_status_flag +
>                   reset_flag +
>                   noop_flag);
>  
> @@ -3377,6 +3383,98 @@ get_supported_messages_ready (QmiClientNas
> *client,
>      operation_shutdown (TRUE);
>  }
>  
> +static void
> +swi_get_status_ready (QmiClientNas *client,
> +                              GAsyncResult *res)
> +{
> +    QmiMessageNasSwiGetStatusOutput *output;
> +    GError *error = NULL;
> +
> +    guint8 temperature;
> +    QmiNasSwiModemMode modem_mode;
> +    QmiNasSwiSystemMode system_mode;
> +    QmiNasSwiImsRegState ims_reg_state;
> +    QmiNasSwiPsState ps_state;
> +
> +    QmiNasActiveBand band;
> +    QmiNasDLBandwidth bandwidth;
> +    guint16 rx_channel;
> +    guint16 tx_channel;
> +    QmiNasSwiEmmState emm_state;
> +    guint8 emm_sub_state;
> +    QmiNasSwiEmmConnectionState emm_conn_state;
> +
> +    output = qmi_client_nas_swi_get_status_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_nas_swi_get_status_output_get_result (output,
> &error)) {
> +        g_printerr ("error: couldn't get status: %s\n", error-
> >message);
> +        g_error_free (error);
> +        qmi_message_nas_swi_get_status_output_unref (output);
> +        operation_shutdown (FALSE);
> +        return;
> +    }
> +
> +    g_print ("[%s] Successfully got status:\n",
> +             qmi_device_get_path_display (ctx->device));
> +
> +    if (qmi_message_nas_swi_get_status_output_get_common_info (
> +            output,
> +            &temperature,
> +            &modem_mode,
> +            &system_mode,
> +            &ims_reg_state,
> +            &ps_state,
> +            NULL)) {
> +        g_print ("Common Info:\n"
> +                "\tTemperature: '%u'\n"
> +                "\tModem mode: '%s'\n"
> +                "\tSystem mode: '%s'\n"
> +                "\tIMS registration state: '%s'\n"
> +                "\tPacket service state: '%s'\n",
> +                temperature,
> +                qmi_nas_swi_modem_mode_get_string (modem_mode),
> +                qmi_nas_swi_system_mode_get_string (system_mode),
> +                qmi_nas_swi_ims_reg_state_get_string
> (ims_reg_state),
> +                qmi_nas_swi_ps_state_get_string (ps_state));
> +    }
> +
> +    if (qmi_message_nas_swi_get_status_output_get_lte_info (
> +            output,
> +            &band,
> +            &bandwidth,
> +            &rx_channel,
> +            &tx_channel,
> +            &emm_state,
> +            &emm_sub_state,
> +            &emm_conn_state,
> +            NULL)) {
> +        g_print ("LTE info:\n"
> +                "\tBand: '%s'\n"
> +                "\tBandwidth: '%s'\n"
> +                "\tRX channel: '%" G_GUINT16_FORMAT"'\n"
> +                "\tTX channel: '%" G_GUINT16_FORMAT"'\n"
> +                "\tEMM state: '%s'\n"
> +                "\tEMM sub state: '%u'\n"
> +                "\tEMM connection state: '%s'\n",
> +                qmi_nas_active_band_get_string (band),
> +                qmi_nas_dl_bandwidth_get_string (bandwidth),
> +                rx_channel,
> +                tx_channel,
> +                qmi_nas_swi_emm_state_get_string (emm_state),
> +                emm_sub_state,
> +                qmi_nas_swi_emm_connection_state_get_string
> (emm_conn_state));
> +    }
> +
> +    qmi_message_nas_swi_get_status_output_unref (output);
> +    operation_shutdown (TRUE);
> +}
> +
>  static void
>  reset_ready (QmiClientNas *client,
>               GAsyncResult *res)
> @@ -3642,6 +3740,18 @@ qmicli_nas_run (QmiDevice *device,
>          return;
>      }
>  
> +    /* Request to get status */
> +    if (swi_get_status_flag) {
> +        g_debug ("Asynchronously getting status (Sierra Wireless
> specific)...");
> +        qmi_client_nas_swi_get_status (ctx->client,
> +                                       NULL,
> +                                       10,
> +                                       ctx->cancellable,
> +                                       (GAsyncReadyCallback)swi_get_
> status_ready,
> +                                       NULL);
> +        return;
> +    }
> +
>      /* Request to reset NAS service? */
>      if (reset_flag) {
>          g_debug ("Asynchronously resetting NAS service...");



More information about the libqmi-devel mailing list