gsm: add AccessTechnology property and associated infrastructure

AccessTechnology takes over half of what NetworkMode was supposed to
do, but we'll keep NetworkMode around for a while for compatibility
anyway.  Create async updaters that subclasses can use to update
the access tech when they get unsolicited messages.
This commit is contained in:
Dan Williams
2010-03-08 11:40:54 -08:00
parent 82d7c8342d
commit 343245fc21
6 changed files with 263 additions and 36 deletions
+10 -10
View File
@@ -11,7 +11,7 @@
* GNU General Public License for more details:
*
* Copyright (C) 2008 - 2009 Novell, Inc.
* Copyright (C) 2009 Red Hat, Inc.
* Copyright (C) 2009 - 2010 Red Hat, Inc.
*/
#include <stdlib.h>
@@ -459,7 +459,7 @@ handle_mode_change (MMSerialPort *port,
gpointer user_data)
{
MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (user_data);
MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self);
MMModemGsmMode new_mode = MM_MODEM_GSM_MODE_UNKNOWN;
char *str;
int a;
int b;
@@ -473,24 +473,24 @@ handle_mode_change (MMSerialPort *port,
g_free (str);
if (a == 3 && b == 2)
priv->mode = MM_MODEM_GSM_MODE_GPRS;
new_mode = MM_MODEM_GSM_MODE_GPRS;
else if (a == 3 && b == 3)
priv->mode = MM_MODEM_GSM_MODE_EDGE;
new_mode = MM_MODEM_GSM_MODE_EDGE;
else if (a == 5 && b == 4)
priv->mode = MM_MODEM_GSM_MODE_UMTS;
new_mode = MM_MODEM_GSM_MODE_UMTS;
else if (a == 5 && b == 5)
priv->mode = MM_MODEM_GSM_MODE_HSDPA;
new_mode = MM_MODEM_GSM_MODE_HSDPA;
else if (a == 5 && b == 6)
priv->mode = MM_MODEM_GSM_MODE_HSUPA;
new_mode = MM_MODEM_GSM_MODE_HSUPA;
else if (a == 5 && b == 7)
priv->mode = MM_MODEM_GSM_MODE_HSPA;
new_mode = MM_MODEM_GSM_MODE_HSPA;
else {
g_warning ("Couldn't parse mode change value: '%s'", str);
return;
}
g_debug ("Mode: %d", priv->mode);
mm_modem_gsm_network_mode (MM_MODEM_GSM_NETWORK (self), priv->mode);
g_debug ("Access Technology: %d", new_mode);
mm_generic_gsm_update_access_technology (MM_GENERIC_GSM (self), new_mode);
}
static void
+121 -23
View File
@@ -29,6 +29,7 @@
#include "mm-serial-parsers.h"
#include "mm-modem-helpers.h"
#include "mm-options.h"
#include "mm-properties-changed-signal.h"
static void modem_init (MMModem *modem_class);
static void modem_gsm_card_init (MMModemGsmCard *gsm_card_class);
@@ -69,7 +70,7 @@ typedef struct {
/* Index 0 for CREG, index 1 for CGREG */
gulong lac[2];
gulong cell_id[2];
gint access_tech[2];
MMModemGsmMode access_tech;
MMModemGsmNetworkRegStatus reg_status;
guint pending_reg_id;
@@ -107,6 +108,8 @@ static gboolean handle_reg_status_response (MMGenericGsm *self,
GString *response,
GError **error);
static MMModemGsmMode etsi_act_to_mm_mode (gint act);
MMModem *
mm_generic_gsm_new (const char *device,
const char *driver,
@@ -864,7 +867,8 @@ disable (MMModem *modem,
MMModemFn callback,
gpointer user_data)
{
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
MMGenericGsm *self = MM_GENERIC_GSM (modem);
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self);
MMCallbackInfo *info;
MMModemState state;
@@ -881,8 +885,7 @@ disable (MMModem *modem,
priv->lac[1] = 0;
priv->cell_id[0] = 0;
priv->cell_id[1] = 0;
priv->access_tech[0] = -1;
priv->access_tech[1] = -1;
mm_generic_gsm_update_access_technology (self, MM_MODEM_GSM_MODE_UNKNOWN);
/* Close the secondary port if its open */
if (priv->secondary && mm_serial_port_is_open (priv->secondary))
@@ -1465,7 +1468,10 @@ reg_state_changed (MMSerialPort *port,
idx = cgreg ? 1 : 0;
priv->lac[idx] = lac;
priv->cell_id[idx] = cell_id;
priv->access_tech[idx] = access_tech;
/* Only update access technology if it appeared in the CREG/CGREG response */
if (access_tech != -1)
mm_generic_gsm_update_access_technology (self, etsi_act_to_mm_mode (access_tech));
}
static gboolean
@@ -1531,8 +1537,10 @@ handle_reg_status_response (MMGenericGsm *self,
idx = cgreg ? 1 : 0;
priv->lac[idx] = lac;
priv->cell_id[idx] = ci;
if (act >= 0) /* Let subclasses handle if they want */
priv->access_tech[idx] = act;
/* Only update access technology if it appeared in the CREG/CGREG response */
if (act != -1)
mm_generic_gsm_update_access_technology (self, etsi_act_to_mm_mode (act));
if ((cgreg == FALSE) && status >= 0) {
/* Update cached registration status */
@@ -2160,6 +2168,84 @@ get_signal_quality (MMModemGsmNetwork *modem,
mm_serial_port_queue_command (connected ? priv->secondary : priv->primary, "+CSQ", 3, get_signal_quality_done, info);
}
/*****************************************************************************/
typedef struct {
MMModemGsmMode mode;
gint etsi_act;
} ModeEtsi;
static ModeEtsi modes_table[] = {
{ MM_MODEM_GSM_MODE_GSM, 0 },
{ MM_MODEM_GSM_MODE_GSM_COMPACT, 1 },
{ MM_MODEM_GSM_MODE_UMTS, 2 },
{ MM_MODEM_GSM_MODE_EDGE, 3 },
{ MM_MODEM_GSM_MODE_HSDPA, 4 },
{ MM_MODEM_GSM_MODE_HSUPA, 5 },
{ MM_MODEM_GSM_MODE_HSDPA |
MM_MODEM_GSM_MODE_HSUPA, 6 },
{ MM_MODEM_GSM_MODE_HSDPA |
MM_MODEM_GSM_MODE_HSUPA, 7 }, /* E-UTRAN/LTE */
{ MM_MODEM_GSM_MODE_UNKNOWN, -1 },
};
static MMModemGsmMode
etsi_act_to_mm_mode (gint act)
{
ModeEtsi *iter = &modes_table[0];
while (iter->mode != MM_MODEM_GSM_MODE_UNKNOWN) {
if (iter->etsi_act == act)
return iter->mode;
}
return MM_MODEM_GSM_MODE_UNKNOWN;
}
static gboolean
check_for_single_value (guint32 value)
{
gboolean found = FALSE;
guint32 i;
for (i = 1; i <= 32; i++) {
if (value & 0x1) {
if (found)
return FALSE; /* More than one bit set */
found = TRUE;
}
value >>= 1;
}
return TRUE;
}
void
mm_generic_gsm_update_access_technology (MMGenericGsm *modem,
MMModemGsmMode mode)
{
MMGenericGsmPrivate *priv;
g_return_if_fail (modem != NULL);
g_return_if_fail (MM_IS_GENERIC_GSM (modem));
g_return_if_fail (check_for_single_value (mode) || (mode == MM_MODEM_GSM_MODE_HSPA));
g_return_if_fail ((mode & MM_MODEM_GSM_MODE_ANY) == 0);
g_return_if_fail ((mode & MM_MODEM_GSM_MODE_2G_PREFERRED) == 0);
g_return_if_fail ((mode & MM_MODEM_GSM_MODE_3G_PREFERRED) == 0);
g_return_if_fail ((mode & MM_MODEM_GSM_MODE_2G_ONLY) == 0);
g_return_if_fail ((mode & MM_MODEM_GSM_MODE_3G_ONLY) == 0);
priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
if (mode != priv->access_tech) {
priv->access_tech = mode;
g_object_notify (G_OBJECT (modem), MM_MODEM_GSM_NETWORK_ACCESS_TECHNOLOGY);
/* Deprecated value */
g_signal_emit_by_name (G_OBJECT (modem), "NetworkMode", mode);
}
}
/*****************************************************************************/
/* MMModemGsmSms interface */
@@ -2409,17 +2495,6 @@ simple_status_got_band (MMModem *modem,
g_hash_table_insert ((GHashTable *) user_data, "band", simple_uint_value (result));
}
static void
simple_status_got_mode (MMModem *modem,
guint32 result,
GError *error,
gpointer user_data)
{
/* Ignore network mode errors since there's no generic implementation for it */
if (!error)
g_hash_table_insert ((GHashTable *) user_data, "network_mode", simple_uint_value (result));
}
static void
simple_status_got_reg_info (MMModemGsmNetwork *modem,
MMModemGsmNetworkRegStatus status,
@@ -2459,9 +2534,11 @@ simple_get_status (MMModemSimple *simple,
MMModemSimpleGetStatusFn callback,
gpointer user_data)
{
MMModemGsmNetwork *gsm;
MMModemGsmNetwork *gsm = MM_MODEM_GSM_NETWORK (simple);
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (simple);
GHashTable *properties;
MMCallbackInfo *info;
MMModemDeprecatedMode old_mode;
info = mm_callback_info_new_full (MM_MODEM (simple),
simple_get_status_invoke,
@@ -2471,11 +2548,18 @@ simple_get_status (MMModemSimple *simple,
properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, simple_free_gvalue);
mm_callback_info_set_data (info, "simple-get-status", properties, (GDestroyNotify) g_hash_table_unref);
gsm = MM_MODEM_GSM_NETWORK (simple);
mm_modem_gsm_network_get_signal_quality (gsm, simple_status_got_signal_quality, properties);
mm_modem_gsm_network_get_band (gsm, simple_status_got_band, properties);
mm_modem_gsm_network_get_mode (gsm, simple_status_got_mode, properties);
mm_modem_gsm_network_get_registration_info (gsm, simple_status_got_reg_info, properties);
if (priv->access_tech > -1) {
/* Deprecated key */
old_mode = mm_modem_gsm_network_new_mode_to_old (priv->access_tech);
g_hash_table_insert (properties, "network_mode", simple_uint_value (old_mode));
/* New key */
g_hash_table_insert (properties, "access_technology", simple_uint_value (priv->access_tech));
}
}
/*****************************************************************************/
@@ -2532,9 +2616,12 @@ mm_generic_gsm_init (MMGenericGsm *self)
{
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self);
priv->access_tech[0] = -1;
priv->access_tech[1] = -1;
priv->access_tech = MM_MODEM_GSM_MODE_UNKNOWN;
priv->reg_regex = mm_gsm_creg_regex_get (TRUE);
mm_properties_changed_signal_register_property (G_OBJECT (self),
MM_MODEM_GSM_NETWORK_ACCESS_TECHNOLOGY,
MM_MODEM_GSM_NETWORK_DBUS_INTERFACE);
}
static void
@@ -2549,6 +2636,7 @@ set_property (GObject *object, guint prop_id,
case MM_GENERIC_GSM_PROP_INIT_CMD_OPTIONAL:
case MM_GENERIC_GSM_PROP_SUPPORTED_BANDS:
case MM_GENERIC_GSM_PROP_SUPPORTED_MODES:
case MM_GENERIC_GSM_PROP_ACCESS_TECHNOLOGY:
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -2597,6 +2685,12 @@ get_property (GObject *object, guint prop_id,
case MM_GENERIC_GSM_PROP_SUPPORTED_MODES:
g_value_set_uint (value, 0);
break;
case MM_GENERIC_GSM_PROP_ACCESS_TECHNOLOGY:
if (mm_modem_get_state (MM_MODEM (object)) >= MM_MODEM_STATE_ENABLED)
g_value_set_uint (value, priv->access_tech);
else
g_value_set_uint (value, MM_MODEM_GSM_MODE_UNKNOWN);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2659,6 +2753,10 @@ mm_generic_gsm_class_init (MMGenericGsmClass *klass)
MM_GENERIC_GSM_PROP_SUPPORTED_MODES,
MM_MODEM_GSM_CARD_SUPPORTED_MODES);
g_object_class_override_property (object_class,
MM_GENERIC_GSM_PROP_ACCESS_TECHNOLOGY,
MM_MODEM_GSM_NETWORK_ACCESS_TECHNOLOGY);
g_object_class_install_property
(object_class, MM_GENERIC_GSM_PROP_POWER_UP_CMD,
g_param_spec_string (MM_GENERIC_GSM_POWER_UP_CMD,
+17 -2
View File
@@ -11,7 +11,7 @@
* GNU General Public License for more details:
*
* Copyright (C) 2008 - 2009 Novell, Inc.
* Copyright (C) 2009 Red Hat, Inc.
* Copyright (C) 2009 - 2010 Red Hat, Inc.
*/
#ifndef MM_GENERIC_GSM_H
@@ -43,7 +43,8 @@ typedef enum {
MM_GENERIC_GSM_PROP_INIT_CMD,
MM_GENERIC_GSM_PROP_SUPPORTED_BANDS,
MM_GENERIC_GSM_PROP_SUPPORTED_MODES,
MM_GENERIC_GSM_PROP_INIT_CMD_OPTIONAL
MM_GENERIC_GSM_PROP_INIT_CMD_OPTIONAL,
MM_GENERIC_GSM_PROP_ACCESS_TECHNOLOGY
} MMGenericGsmProp;
@@ -76,6 +77,13 @@ typedef struct {
GString *response,
GError *error,
MMCallbackInfo *info);
/* Called by the generic class to the current radio access technology the
* device is using while communicating with the base station.
*/
void (*get_access_technology) (MMGenericGsm *self,
MMModemUIntFn callback,
gpointer user_data);
} MMGenericGsmClass;
GType mm_generic_gsm_get_type (void);
@@ -97,6 +105,13 @@ guint32 mm_generic_gsm_get_cid (MMGenericGsm *modem);
void mm_generic_gsm_set_reg_status (MMGenericGsm *modem,
MMModemGsmNetworkRegStatus status);
/* Called to asynchronously update the current access technology of the device;
* this is NOT the 2G/3G mode preference, but the current radio access
* technology being used to communicate with the base station.
*/
void mm_generic_gsm_update_access_technology (MMGenericGsm *modem,
MMModemGsmMode mode);
void mm_generic_gsm_check_pin (MMGenericGsm *modem,
MMModemFn callback,
gpointer user_data);
+85
View File
@@ -11,6 +11,7 @@
* GNU General Public License for more details:
*
* Copyright (C) 2008 Novell, Inc.
* Copyright (C) 2010 Red Hat, Inc.
*/
#include <string.h>
@@ -42,6 +43,10 @@ static void impl_gsm_modem_set_band (MMModemGsmNetwork *modem,
static void impl_gsm_modem_get_band (MMModemGsmNetwork *modem,
DBusGMethodInvocation *context);
static void impl_gsm_modem_set_allowed_modes (MMModemGsmNetwork *modem,
MMModemGsmMode mode,
DBusGMethodInvocation *context);
static void impl_gsm_modem_set_network_mode (MMModemGsmNetwork *modem,
MMModemGsmMode mode,
DBusGMethodInvocation *context);
@@ -68,6 +73,67 @@ static guint signals[LAST_SIGNAL] = { 0 };
/*****************************************************************************/
MMModemGsmMode
mm_modem_gsm_network_old_mode_to_new (MMModemDeprecatedMode old_mode)
{
/* Translate deprecated mode into new mode */
switch (old_mode) {
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_GPRS:
return MM_MODEM_GSM_MODE_GPRS;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_EDGE:
return MM_MODEM_GSM_MODE_EDGE;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_UMTS:
return MM_MODEM_GSM_MODE_UMTS;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSDPA:
return MM_MODEM_GSM_MODE_HSDPA;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_PREFERRED:
return MM_MODEM_GSM_MODE_2G_PREFERRED;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_PREFERRED:
return MM_MODEM_GSM_MODE_3G_PREFERRED;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_ONLY:
return MM_MODEM_GSM_MODE_2G_ONLY;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_ONLY:
return MM_MODEM_GSM_MODE_3G_ONLY;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSUPA:
return MM_MODEM_GSM_MODE_HSUPA;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSPA:
return MM_MODEM_GSM_MODE_HSDPA | MM_MODEM_GSM_MODE_HSUPA;
case MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_ANY:
default:
break;
}
return MM_MODEM_GSM_MODE_ANY;
}
MMModemDeprecatedMode
mm_modem_gsm_network_new_mode_to_old (MMModemGsmMode new_mode)
{
/* Translate new mode into old deprecated mode */
if (new_mode & MM_MODEM_GSM_MODE_GPRS)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_GPRS;
else if (new_mode & MM_MODEM_GSM_MODE_EDGE)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_EDGE;
else if (new_mode & MM_MODEM_GSM_MODE_UMTS)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_UMTS;
else if (new_mode & MM_MODEM_GSM_MODE_HSDPA)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSDPA;
else if (new_mode & MM_MODEM_GSM_MODE_2G_PREFERRED)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_PREFERRED;
else if (new_mode & MM_MODEM_GSM_MODE_3G_PREFERRED)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_PREFERRED;
else if (new_mode & MM_MODEM_GSM_MODE_2G_ONLY)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_ONLY;
else if (new_mode & MM_MODEM_GSM_MODE_3G_ONLY)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_ONLY;
else if (new_mode & MM_MODEM_GSM_MODE_HSUPA)
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSUPA;
return MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_ANY;
}
/*****************************************************************************/
static void
async_call_done (MMModem *modem, GError *error, gpointer user_data)
{
@@ -491,6 +557,14 @@ impl_gsm_modem_get_band (MMModemGsmNetwork *modem,
mm_modem_gsm_network_get_band (modem, uint_call_done, context);
}
static void
impl_gsm_modem_set_allowed_modes (MMModemGsmNetwork *modem,
MMModemGsmMode mode,
DBusGMethodInvocation *context)
{
dbus_g_method_return (context);
}
static void
impl_gsm_modem_set_network_mode (MMModemGsmNetwork *modem,
MMModemGsmMode mode,
@@ -534,6 +608,17 @@ mm_modem_gsm_network_init (gpointer g_iface)
if (initialized)
return;
g_object_interface_install_property
(g_iface,
g_param_spec_uint (MM_MODEM_GSM_NETWORK_ACCESS_TECHNOLOGY,
"Access Technology",
"Current access technology in use when connected to "
"a mobile network.",
MM_MODEM_GSM_MODE_UNKNOWN,
MM_MODEM_GSM_MODE_LAST,
MM_MODEM_GSM_MODE_UNKNOWN,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
/* Signals */
signals[SIGNAL_QUALITY] =
g_signal_new ("signal-quality",
+15 -1
View File
@@ -11,7 +11,7 @@
* GNU General Public License for more details:
*
* Copyright (C) 2008 Novell, Inc.
* Copyright (C) 2009 Red Hat, Inc.
* Copyright (C) 2009 - 2010 Red Hat, Inc.
*/
#ifndef MM_MODEM_GSM_NETWORK_H
@@ -20,11 +20,21 @@
#include <mm-modem.h>
#include <mm-modem-gsm.h>
#define MM_MODEM_GSM_NETWORK_DBUS_INTERFACE "org.freedesktop.ModemManager.Modem.Gsm.Network"
#define MM_TYPE_MODEM_GSM_NETWORK (mm_modem_gsm_network_get_type ())
#define MM_MODEM_GSM_NETWORK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_MODEM_GSM_NETWORK, MMModemGsmNetwork))
#define MM_IS_MODEM_GSM_NETWORK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_MODEM_GSM_NETWORK))
#define MM_MODEM_GSM_NETWORK_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MM_TYPE_MODEM_GSM_NETWORK, MMModemGsmNetwork))
#define MM_MODEM_GSM_NETWORK_ACCESS_TECHNOLOGY "access-technology"
typedef enum {
MM_MODEM_GSM_NETWORK_PROP_FIRST = 0x1200,
MM_MODEM_GSM_NETWORK_PROP_ACCESS_TECHNOLOGY = MM_MODEM_GSM_NETWORK_PROP_FIRST,
} MMModemGsmNetworkProp;
typedef enum {
MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE = 0,
MM_MODEM_GSM_NETWORK_REG_STATUS_HOME = 1,
@@ -161,4 +171,8 @@ void mm_modem_gsm_network_registration_info (MMModemGsmNetwork *self,
void mm_modem_gsm_network_mode (MMModemGsmNetwork *self,
MMModemGsmMode mode);
MMModemDeprecatedMode mm_modem_gsm_network_new_mode_to_old (MMModemGsmMode new_mode);
MMModemGsmMode mm_modem_gsm_network_old_mode_to_new (MMModemDeprecatedMode old_mode);
#endif /* MM_MODEM_GSM_NETWORK_H */
+15
View File
@@ -29,12 +29,27 @@ typedef enum {
MM_MODEM_GSM_MODE_2G_ONLY = 0x00000080,
MM_MODEM_GSM_MODE_3G_ONLY = 0x00000100,
MM_MODEM_GSM_MODE_HSUPA = 0x00000200,
MM_MODEM_GSM_MODE_HSPA = 0x00000210, /* HSDPA + HSUPA */
MM_MODEM_GSM_MODE_GSM = 0x00000400,
MM_MODEM_GSM_MODE_GSM_COMPACT = 0x00000800,
MM_MODEM_GSM_MODE_LAST = MM_MODEM_GSM_MODE_GSM_COMPACT
} MMModemGsmMode;
typedef enum {
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_ANY = 0,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_GPRS,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_EDGE,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_UMTS,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSDPA,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_PREFERRED,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_PREFERRED,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_2G_ONLY,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_3G_ONLY,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSUPA,
MM_MODEM_GSM_NETWORK_DEPRECATED_MODE_HSPA
} MMModemDeprecatedMode;
typedef enum {
MM_MODEM_GSM_BAND_UNKNOWN = 0x00000000,
MM_MODEM_GSM_BAND_ANY = 0x00000001,