aboutsummaryrefslogtreecommitdiff
path: root/plugins/wavecom/mm-broadband-modem-wavecom.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/wavecom/mm-broadband-modem-wavecom.c')
-rw-r--r--plugins/wavecom/mm-broadband-modem-wavecom.c134
1 files changed, 87 insertions, 47 deletions
diff --git a/plugins/wavecom/mm-broadband-modem-wavecom.c b/plugins/wavecom/mm-broadband-modem-wavecom.c
index 6f487b42..1ee16e99 100644
--- a/plugins/wavecom/mm-broadband-modem-wavecom.c
+++ b/plugins/wavecom/mm-broadband-modem-wavecom.c
@@ -37,6 +37,8 @@
static void iface_modem_init (MMIfaceModem *iface);
+static MMIfaceModem *iface_modem_parent;
+
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemWavecom, mm_broadband_modem_wavecom, MM_TYPE_BROADBAND_MODEM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init))
@@ -82,18 +84,17 @@ static const WavecomBand3G bands_3g[] = {
};
/*****************************************************************************/
-/* Supported modes (Modem interface) */
+/* Load supported modes (Modem interface) */
-static MMModemMode
+static GArray *
load_supported_modes_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error)
{
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
- return MM_MODEM_MODE_NONE;
+ return NULL;
- return (MMModemMode) GPOINTER_TO_UINT (g_simple_async_result_get_op_res_gpointer (
- G_SIMPLE_ASYNC_RESULT (res)));
+ return g_array_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)));
}
static void
@@ -101,9 +102,13 @@ supported_ms_classes_query_ready (MMBaseModem *self,
GAsyncResult *res,
GSimpleAsyncResult *simple)
{
+ GArray *all;
+ GArray *combinations;
+ GArray *filtered;
const gchar *response;
GError *error = NULL;
- MMModemMode mode;
+ MMModemModeCombination mode;
+ MMModemMode mode_all;
response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
if (!response) {
@@ -115,40 +120,71 @@ supported_ms_classes_query_ready (MMBaseModem *self,
}
response = mm_strip_tag (response, "+CGCLASS:");
- mode = MM_MODEM_MODE_NONE;
-
- if (strstr (response, WAVECOM_MS_CLASS_A_IDSTR)) {
- mm_dbg ("Modem supports Class A mobile station");
- mode |= MM_MODEM_MODE_3G;
- }
-
- if (strstr (response, WAVECOM_MS_CLASS_B_IDSTR)) {
- mm_dbg ("Modem supports Class B mobile station");
- mode |= (MM_MODEM_MODE_2G | MM_MODEM_MODE_CS);
- }
-
- if (strstr (response, WAVECOM_MS_CLASS_CG_IDSTR)) {
- mm_dbg ("Modem supports Class CG mobile station");
- mode |= MM_MODEM_MODE_2G;
- }
-
- if (strstr (response, WAVECOM_MS_CLASS_CC_IDSTR)) {
- mm_dbg ("Modem supports Class CC mobile station");
- mode |= MM_MODEM_MODE_CS;
- }
+ mode_all = MM_MODEM_MODE_NONE;
+ if (strstr (response, WAVECOM_MS_CLASS_A_IDSTR))
+ mode_all |= MM_MODEM_MODE_3G;
+ if (strstr (response, WAVECOM_MS_CLASS_B_IDSTR))
+ mode_all |= (MM_MODEM_MODE_2G | MM_MODEM_MODE_CS);
+ if (strstr (response, WAVECOM_MS_CLASS_CG_IDSTR))
+ mode_all |= MM_MODEM_MODE_2G;
+ if (strstr (response, WAVECOM_MS_CLASS_CC_IDSTR))
+ mode_all |= MM_MODEM_MODE_CS;
/* If none received, error */
- if (mode == MM_MODEM_MODE_NONE)
+ if (mode_all == MM_MODEM_MODE_NONE) {
g_simple_async_result_set_error (simple,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Couldn't get supported mobile station classes: '%s'",
response);
- else
- g_simple_async_result_set_op_res_gpointer (simple,
- GUINT_TO_POINTER (mode),
- NULL);
+ g_simple_async_result_complete (simple);
+ g_object_unref (simple);
+ return;
+ }
+ /* Build ALL mask */
+ all = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 1);
+ mode.allowed = mode_all;
+ mode.preferred = MM_MODEM_MODE_NONE;
+ g_array_append_val (all, mode);
+
+ /* Build list of combinations */
+ combinations = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 7);
+ /* CS only */
+ mode.allowed = MM_MODEM_MODE_CS;
+ mode.preferred = MM_MODEM_MODE_NONE;
+ g_array_append_val (combinations, mode);
+ /* 2G only */
+ mode.allowed = MM_MODEM_MODE_2G;
+ mode.preferred = MM_MODEM_MODE_NONE;
+ g_array_append_val (combinations, mode);
+ /* CS and 2G */
+ mode.allowed = (MM_MODEM_MODE_CS | MM_MODEM_MODE_2G);
+ mode.preferred = MM_MODEM_MODE_2G;
+ g_array_append_val (combinations, mode);
+ /* 3G only */
+ mode.allowed = MM_MODEM_MODE_3G;
+ mode.preferred = MM_MODEM_MODE_NONE;
+ g_array_append_val (combinations, mode);
+ /* 2G and 3G */
+ mode.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G);
+ mode.preferred = MM_MODEM_MODE_NONE;
+ g_array_append_val (combinations, mode);
+ /* 2G and 3G, 2G preferred */
+ mode.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G);
+ mode.preferred = MM_MODEM_MODE_2G;
+ g_array_append_val (combinations, mode);
+ /* 2G and 3G, 3G preferred */
+ mode.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G);
+ mode.preferred = MM_MODEM_MODE_3G;
+ g_array_append_val (combinations, mode);
+
+ /* Filter out those unsupported modes */
+ filtered = mm_filter_supported_modes (all, combinations);
+ g_array_unref (all);
+ g_array_unref (combinations);
+
+ g_simple_async_result_set_op_res_gpointer (simple, filtered, (GDestroyNotify) g_array_unref);
g_simple_async_result_complete (simple);
g_object_unref (simple);
}
@@ -158,20 +194,16 @@ load_supported_modes (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
-
- result = g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- load_supported_modes);
-
mm_base_modem_at_command (
MM_BASE_MODEM (self),
"+CGCLASS=?",
3,
FALSE,
(GAsyncReadyCallback)supported_ms_classes_query_ready,
- result);
+ g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ load_supported_modes));
}
/*****************************************************************************/
@@ -387,8 +419,6 @@ load_allowed_modes (MMIfaceModem *self,
typedef struct {
MMBroadbandModemWavecom *self;
GSimpleAsyncResult *result;
- MMModemMode allowed;
- MMModemMode preferred;
gchar *cgclass_command;
gchar *wwsm_command;
} SetAllowedModesContext;
@@ -473,19 +503,27 @@ set_allowed_modes (MMIfaceModem *self,
callback,
user_data,
set_allowed_modes);
- ctx->allowed = allowed;
- ctx->preferred = preferred;
+
+ /* Handle ANY/NONE */
+ if (allowed == MM_MODEM_MODE_ANY && preferred == MM_MODEM_MODE_NONE) {
+ if (mm_iface_modem_is_3g (self)) {
+ allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G);
+ preferred = MM_MODEM_MODE_NONE;
+ } else {
+ allowed = (MM_MODEM_MODE_CS | MM_MODEM_MODE_2G);
+ preferred = MM_MODEM_MODE_2G;
+ }
+ }
if (allowed == MM_MODEM_MODE_CS)
ctx->cgclass_command = g_strdup ("+CGCLASS=" WAVECOM_MS_CLASS_CC_IDSTR);
else if (allowed == MM_MODEM_MODE_2G)
ctx->cgclass_command = g_strdup ("+CGCLASS=" WAVECOM_MS_CLASS_CG_IDSTR);
else if (allowed == (MM_MODEM_MODE_2G | MM_MODEM_MODE_CS) &&
- preferred == MM_MODEM_MODE_NONE)
+ preferred == MM_MODEM_MODE_2G)
ctx->cgclass_command = g_strdup ("+CGCLASS=" WAVECOM_MS_CLASS_B_IDSTR);
else if (allowed & MM_MODEM_MODE_3G) {
- if (allowed == (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G) ||
- allowed == (MM_MODEM_MODE_CS | MM_MODEM_MODE_2G | MM_MODEM_MODE_3G)) {
+ if (allowed == (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G)) {
if (preferred == MM_MODEM_MODE_2G)
ctx->wwsm_command = g_strdup ("+WWSM=2,1");
else if (preferred == MM_MODEM_MODE_3G)
@@ -1144,6 +1182,8 @@ mm_broadband_modem_wavecom_init (MMBroadbandModemWavecom *self)
static void
iface_modem_init (MMIfaceModem *iface)
{
+ iface_modem_parent = g_type_interface_peek_parent (iface);
+
iface->load_supported_modes = load_supported_modes;
iface->load_supported_modes_finish = load_supported_modes_finish;
iface->load_allowed_modes = load_allowed_modes;