diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mm-modem-huawei-gsm.c | 101 | ||||
-rw-r--r-- | plugins/mm-modem-mbm.c | 65 | ||||
-rw-r--r-- | plugins/mm-modem-option.c | 46 |
3 files changed, 105 insertions, 107 deletions
diff --git a/plugins/mm-modem-huawei-gsm.c b/plugins/mm-modem-huawei-gsm.c index af6a4b7b..4594872b 100644 --- a/plugins/mm-modem-huawei-gsm.c +++ b/plugins/mm-modem-huawei-gsm.c @@ -41,7 +41,6 @@ G_DEFINE_TYPE_EXTENDED (MMModemHuaweiGsm, mm_modem_huawei_gsm, MM_TYPE_GENERIC_G typedef struct { /* Cached state */ guint signal_quality; - MMModemGsmMode mode; MMModemGsmBand band; } MMModemHuaweiGsmPrivate; @@ -68,23 +67,28 @@ parse_syscfg (MMModemHuaweiGsm *self, int *mode_b, guint32 *band, int *unknown1, - int *unknown2) + int *unknown2, + MMModemGsmMode *out_mode) { if (reply == NULL || strncmp (reply, "^SYSCFG:", 8)) return FALSE; if (sscanf (reply + 8, "%d,%d,%x,%d,%d", mode_a, mode_b, band, unknown1, unknown2)) { MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self); - + MMModemGsmMode new_mode = MM_MODEM_GSM_MODE_ANY; + /* Network mode */ if (*mode_a == 2 && *mode_b == 1) - priv->mode = MM_MODEM_GSM_MODE_2G_PREFERRED; + new_mode = MM_MODEM_GSM_MODE_2G_PREFERRED; else if (*mode_a == 2 && *mode_b == 2) - priv->mode = MM_MODEM_GSM_MODE_3G_PREFERRED; + new_mode = MM_MODEM_GSM_MODE_3G_PREFERRED; else if (*mode_a == 13 && *mode_b == 1) - priv->mode = MM_MODEM_GSM_MODE_2G_ONLY; + new_mode = MM_MODEM_GSM_MODE_2G_ONLY; else if (*mode_a == 14 && *mode_b == 2) - priv->mode = MM_MODEM_GSM_MODE_3G_ONLY; + new_mode = MM_MODEM_GSM_MODE_3G_ONLY; + + if (out_mode) + *out_mode = new_mode; /* Band */ if (*band == 0x3FFFFFFF) @@ -101,26 +105,21 @@ parse_syscfg (MMModemHuaweiGsm *self, } static void -set_network_mode_done (MMSerialPort *port, +set_allowed_mode_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (info->modem); - MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self); if (error) info->error = g_error_copy (error); - else - /* Success, cache the value */ - priv->mode = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "mode")); mm_callback_info_schedule (info); } static void -set_network_mode_get_done (MMSerialPort *port, +set_allowed_mode_get_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) @@ -134,7 +133,7 @@ set_network_mode_get_done (MMSerialPort *port, int a, b, u1, u2; guint32 band; - if (parse_syscfg (MM_MODEM_HUAWEI_GSM (info->modem), response->str, &a, &b, &band, &u1, &u2)) { + if (parse_syscfg (MM_MODEM_HUAWEI_GSM (info->modem), response->str, &a, &b, &band, &u1, &u2, NULL)) { char *command; switch (GPOINTER_TO_UINT (mm_callback_info_get_data (info, "mode"))) { @@ -142,16 +141,10 @@ set_network_mode_get_done (MMSerialPort *port, a = 2; b = 0; break; - case MM_MODEM_GSM_MODE_GPRS: - case MM_MODEM_GSM_MODE_EDGE: case MM_MODEM_GSM_MODE_2G_ONLY: a = 13; b = 1; break; - case MM_MODEM_GSM_MODE_UMTS: - case MM_MODEM_GSM_MODE_HSDPA: - case MM_MODEM_GSM_MODE_HSUPA: - case MM_MODEM_GSM_MODE_HSPA: case MM_MODEM_GSM_MODE_3G_ONLY: a = 14; b = 2; @@ -169,14 +162,14 @@ set_network_mode_get_done (MMSerialPort *port, } command = g_strdup_printf ("AT^SYSCFG=%d,%d,%X,%d,%d", a, b, band, u1, u2); - mm_serial_port_queue_command (port, command, 3, set_network_mode_done, info); + mm_serial_port_queue_command (port, command, 3, set_allowed_mode_done, info); g_free (command); } } } static void -set_network_mode (MMModemGsmNetwork *modem, +set_allowed_mode (MMGenericGsm *gsm, MMModemGsmMode mode, MMModemFn callback, gpointer user_data) @@ -184,28 +177,26 @@ set_network_mode (MMModemGsmNetwork *modem, MMCallbackInfo *info; MMSerialPort *primary; - info = mm_callback_info_new (MM_MODEM (modem), callback, user_data); + info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); switch (mode) { case MM_MODEM_GSM_MODE_ANY: - case MM_MODEM_GSM_MODE_GPRS: - case MM_MODEM_GSM_MODE_EDGE: - case MM_MODEM_GSM_MODE_UMTS: - case MM_MODEM_GSM_MODE_HSDPA: - case MM_MODEM_GSM_MODE_HSUPA: - case MM_MODEM_GSM_MODE_HSPA: case MM_MODEM_GSM_MODE_2G_PREFERRED: case MM_MODEM_GSM_MODE_3G_PREFERRED: case MM_MODEM_GSM_MODE_2G_ONLY: case MM_MODEM_GSM_MODE_3G_ONLY: /* Allowed values */ mm_callback_info_set_data (info, "mode", GUINT_TO_POINTER (mode), NULL); - primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (gsm), MM_PORT_TYPE_PRIMARY); g_assert (primary); - mm_serial_port_queue_command (primary, "AT^SYSCFG?", 3, set_network_mode_get_done, info); + + /* Get current configuration first so we don't change band and other + * stuff when updating the mode. + */ + mm_serial_port_queue_command (primary, "AT^SYSCFG?", 3, set_allowed_mode_get_done, info); return; default: - info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, "Invalid mode."); + info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, "Unsupported allowed mode."); break; } @@ -213,49 +204,37 @@ set_network_mode (MMModemGsmNetwork *modem, } static void -get_network_mode_done (MMSerialPort *port, +get_allowed_mode_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (info->modem); - MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self); int mode_a, mode_b, u1, u2; guint32 band; + MMModemGsmMode mode = MM_MODEM_GSM_MODE_ANY; if (error) info->error = g_error_copy (error); - else if (parse_syscfg (self, response->str, &mode_a, &mode_b, &band, &u1, &u2)) - mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->mode), NULL); + else if (parse_syscfg (self, response->str, &mode_a, &mode_b, &band, &u1, &u2, &mode)) + mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL); mm_callback_info_schedule (info); } static void -get_network_mode (MMModemGsmNetwork *modem, +get_allowed_mode (MMGenericGsm *gsm, MMModemUIntFn callback, gpointer user_data) { - MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (modem); - - if (priv->mode != MM_MODEM_GSM_MODE_ANY) { - /* have cached mode (from an unsolicited message). Use that */ - MMCallbackInfo *info; - - info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); - mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->mode), NULL); - mm_callback_info_schedule (info); - } else { - /* Get it from modem */ - MMCallbackInfo *info; - MMSerialPort *primary; + MMCallbackInfo *info; + MMSerialPort *primary; - info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); - primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); - g_assert (primary); - mm_serial_port_queue_command (primary, "AT^SYSCFG?", 3, get_network_mode_done, info); - } + info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data); + primary = mm_generic_gsm_get_port (gsm, MM_PORT_TYPE_PRIMARY); + g_assert (primary); + mm_serial_port_queue_command (primary, "AT^SYSCFG?", 3, get_allowed_mode_done, info); } static void @@ -293,7 +272,7 @@ set_band_get_done (MMSerialPort *port, int a, b, u1, u2; guint32 band; - if (parse_syscfg (self, response->str, &a, &b, &band, &u1, &u2)) { + if (parse_syscfg (self, response->str, &a, &b, &band, &u1, &u2, NULL)) { char *command; switch (GPOINTER_TO_UINT (mm_callback_info_get_data (info, "band"))) { @@ -370,7 +349,7 @@ get_band_done (MMSerialPort *port, if (error) info->error = g_error_copy (error); - else if (parse_syscfg (self, response->str, &mode_a, &mode_b, &band, &u1, &u2)) + else if (parse_syscfg (self, response->str, &mode_a, &mode_b, &band, &u1, &u2, NULL)) mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->band), NULL); mm_callback_info_schedule (info); @@ -596,8 +575,6 @@ modem_init (MMModem *modem_class) static void modem_gsm_network_init (MMModemGsmNetwork *class) { - class->set_network_mode = set_network_mode; - class->get_network_mode = get_network_mode; class->set_band = set_band; class->get_band = get_band; class->get_signal_quality = get_signal_quality; @@ -612,8 +589,12 @@ static void mm_modem_huawei_gsm_class_init (MMModemHuaweiGsmClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + MMGenericGsmClass *gsm_class = MM_GENERIC_GSM_CLASS (klass); mm_modem_huawei_gsm_parent_class = g_type_class_peek_parent (klass); g_type_class_add_private (object_class, sizeof (MMModemHuaweiGsmPrivate)); + + gsm_class->set_allowed_mode = set_allowed_mode; + gsm_class->get_allowed_mode = get_allowed_mode; } diff --git a/plugins/mm-modem-mbm.c b/plugins/mm-modem-mbm.c index 417457f7..72bd48a7 100644 --- a/plugins/mm-modem-mbm.c +++ b/plugins/mm-modem-mbm.c @@ -1,11 +1,13 @@ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* - * Copyright (C) 2008 Ericsson AB + * Copyright (C) 2008 - 2010 Ericsson AB + * Copyright (C) 2009 - 2010 Red Hat, Inc. * * Author: Per Hallsmark <per.hallsmark@ericsson.com> * Bjorn Runaker <bjorn.runaker@ericsson.com> * Torgny Johansson <torgny.johansson@ericsson.com> * Jonas Sjöquist <jonas.sjoquist@ericsson.com> + * Dan Williams <dcbw@redhat.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -170,14 +172,9 @@ mbm_parse_network_mode (MMModemGsmMode network_mode) case MM_MODEM_GSM_MODE_3G_PREFERRED: case MM_MODEM_GSM_MODE_2G_PREFERRED: return MBM_NETWORK_MODE_ANY; - case MM_MODEM_GSM_MODE_GPRS: - case MM_MODEM_GSM_MODE_EDGE: case MM_MODEM_GSM_MODE_2G_ONLY: return MBM_NETWORK_MODE_2G; case MM_MODEM_GSM_MODE_3G_ONLY: - case MM_MODEM_GSM_MODE_HSDPA: - case MM_MODEM_GSM_MODE_HSUPA: - case MM_MODEM_GSM_MODE_HSPA: return MBM_NETWORK_MODE_3G; default: return MBM_NETWORK_MODE_ANY; @@ -185,7 +182,7 @@ mbm_parse_network_mode (MMModemGsmMode network_mode) } static void -mbm_set_network_mode_done (MMSerialPort *port, +mbm_set_allowed_mode_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) @@ -199,7 +196,7 @@ mbm_set_network_mode_done (MMSerialPort *port, } static void -set_network_mode (MMModemGsmNetwork *modem, +set_allowed_mode (MMGenericGsm *gsm, MMModemGsmMode mode, MMModemFn callback, gpointer user_data) @@ -208,15 +205,16 @@ set_network_mode (MMModemGsmNetwork *modem, char *command; MMSerialPort *primary; - info = mm_callback_info_new (MM_MODEM (modem), callback, user_data); - primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); + primary = mm_generic_gsm_get_port (gsm, MM_PORT_TYPE_PRIMARY); g_assert (primary); command = g_strdup_printf ("+CFUN=%d", mbm_parse_network_mode (mode)); - mm_serial_port_queue_command (primary, command, 3, mbm_set_network_mode_done, info); + mm_serial_port_queue_command (primary, command, 3, mbm_set_allowed_mode_done, info); g_free (command); } +#if 0 static void get_network_mode_done (MMSerialPort *port, GString *response, @@ -266,19 +264,52 @@ done: mm_callback_info_schedule (info); } +#endif + +static void +get_allowed_mode_done (MMSerialPort *port, + GString *response, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + gboolean parsed = FALSE; + + if (error) + info->error = g_error_copy (error); + else if (!g_str_has_prefix (response->str, "CFUN: ")) { + MMModemGsmMode mode = MM_MODEM_GSM_MODE_ANY; + int a; + + a = atoi (response->str + 6); + if (a == MBM_NETWORK_MODE_2G) + mode = MM_MODEM_GSM_MODE_2G_ONLY; + else if (a == MBM_NETWORK_MODE_3G) + mode = MM_MODEM_GSM_MODE_3G_ONLY; + + mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL); + parsed = TRUE; + } + + if (!error && !parsed) + info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, + "Could not parse allowed mode results"); + + mm_callback_info_schedule (info); +} static void -get_network_mode (MMModemGsmNetwork *modem, +get_allowed_mode (MMGenericGsm *gsm, MMModemUIntFn callback, gpointer user_data) { MMCallbackInfo *info; MMSerialPort *primary; - info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); - primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data); + primary = mm_generic_gsm_get_port (gsm, MM_PORT_TYPE_PRIMARY); g_assert (primary); - mm_serial_port_queue_command (primary, "*ERINFO?", 3, get_network_mode_done, info); + mm_serial_port_queue_command (primary, "CFUN?", 3, get_allowed_mode_done, info); } /*****************************************************************************/ @@ -782,8 +813,6 @@ static void modem_gsm_network_init (MMModemGsmNetwork *class) { class->do_register = do_register; - class->get_network_mode = get_network_mode; - class->set_network_mode = set_network_mode; } static void @@ -832,5 +861,7 @@ mm_modem_mbm_class_init (MMModemMbmClass *klass) object_class->finalize = finalize; gsm_class->do_enable = do_enable; + gsm_class->get_allowed_mode = get_allowed_mode; + gsm_class->set_allowed_mode = set_allowed_mode; } diff --git a/plugins/mm-modem-option.c b/plugins/mm-modem-option.c index 273cb95a..ddd947da 100644 --- a/plugins/mm-modem-option.c +++ b/plugins/mm-modem-option.c @@ -22,10 +22,7 @@ #include "mm-errors.h" #include "mm-callback-info.h" -static void modem_gsm_network_init (MMModemGsmNetwork *gsm_network_class); - -G_DEFINE_TYPE_EXTENDED (MMModemOption, mm_modem_option, MM_TYPE_GENERIC_GSM, 0, - G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM_GSM_NETWORK, modem_gsm_network_init)) +G_DEFINE_TYPE (MMModemOption, mm_modem_option, MM_TYPE_GENERIC_GSM) #define MM_MODEM_OPTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODEM_OPTION, MMModemOptionPrivate)) @@ -90,7 +87,7 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, } static void -get_network_mode_done (MMSerialPort *port, +get_allowed_mode_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) @@ -130,27 +127,27 @@ get_network_mode_done (MMSerialPort *port, if (!error && !parsed) info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, - "Could not parse network mode results"); + "Could not parse allowed mode results"); mm_callback_info_schedule (info); } static void -get_network_mode (MMModemGsmNetwork *modem, +get_allowed_mode (MMGenericGsm *gsm, MMModemUIntFn callback, gpointer user_data) { MMCallbackInfo *info; MMSerialPort *primary; - info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); - primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data); + primary = mm_generic_gsm_get_port (gsm, MM_PORT_TYPE_PRIMARY); g_assert (primary); - mm_serial_port_queue_command (primary, "AT_OPSYS?", 3, get_network_mode_done, info); + mm_serial_port_queue_command (primary, "AT_OPSYS?", 3, get_allowed_mode_done, info); } static void -set_network_mode_done (MMSerialPort *port, +set_allowed_mode_done (MMSerialPort *port, GString *response, GError *error, gpointer user_data) @@ -159,12 +156,12 @@ set_network_mode_done (MMSerialPort *port, if (error) info->error = g_error_copy (error); - + mm_callback_info_schedule (info); } static void -set_network_mode (MMModemGsmNetwork *modem, +set_allowed_mode (MMGenericGsm *gsm, MMModemGsmMode mode, MMModemFn callback, gpointer user_data) @@ -174,19 +171,12 @@ set_network_mode (MMModemGsmNetwork *modem, char *command; int i; - info = mm_callback_info_new (MM_MODEM (modem), callback, user_data); + info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); switch (mode) { - case MM_MODEM_GSM_MODE_ANY: - case MM_MODEM_GSM_MODE_GPRS: - case MM_MODEM_GSM_MODE_EDGE: case MM_MODEM_GSM_MODE_2G_ONLY: i = 0; break; - case MM_MODEM_GSM_MODE_UMTS: - case MM_MODEM_GSM_MODE_HSDPA: - case MM_MODEM_GSM_MODE_HSUPA: - case MM_MODEM_GSM_MODE_HSPA: case MM_MODEM_GSM_MODE_3G_ONLY: i = 1; break; @@ -196,28 +186,22 @@ set_network_mode (MMModemGsmNetwork *modem, case MM_MODEM_GSM_MODE_3G_PREFERRED: i = 3; break; + case MM_MODEM_GSM_MODE_ANY: default: i = 5; break; } command = g_strdup_printf ("AT_OPSYS=%d,2", i); - primary = mm_generic_gsm_get_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); + primary = mm_generic_gsm_get_port (gsm, MM_PORT_TYPE_PRIMARY); g_assert (primary); - mm_serial_port_queue_command (primary, command, 3, set_network_mode_done, info); + mm_serial_port_queue_command (primary, command, 3, set_allowed_mode_done, info); g_free (command); } /*****************************************************************************/ static void -modem_gsm_network_init (MMModemGsmNetwork *class) -{ - class->set_network_mode = set_network_mode; - class->get_network_mode = get_network_mode; -} - -static void mm_modem_option_init (MMModemOption *self) { } @@ -242,5 +226,7 @@ mm_modem_option_class_init (MMModemOptionClass *klass) object_class->dispose = dispose; gsm_class->do_enable_power_up_done = real_do_enable_power_up_done; + gsm_class->set_allowed_mode = set_allowed_mode; + gsm_class->get_allowed_mode = get_allowed_mode; } |