aboutsummaryrefslogtreecommitdiff
path: root/plugins/mm-modem-sierra-gsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mm-modem-sierra-gsm.c')
-rw-r--r--plugins/mm-modem-sierra-gsm.c81
1 files changed, 34 insertions, 47 deletions
diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c
index 1a9b7351..9247eaed 100644
--- a/plugins/mm-modem-sierra-gsm.c
+++ b/plugins/mm-modem-sierra-gsm.c
@@ -163,7 +163,7 @@ get_allowed_mode (MMGenericGsm *gsm,
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
/* Sierra secondary ports don't have full AT command interpreters */
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
+ primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY);
if (!primary || mm_port_get_connected (MM_PORT (primary))) {
g_set_error_literal (&info->error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
"Cannot perform this operation while connected");
@@ -213,7 +213,7 @@ set_allowed_mode (MMGenericGsm *gsm,
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
/* Sierra secondary ports don't have full AT command interpreters */
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
+ primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY);
if (!primary || mm_port_get_connected (MM_PORT (primary))) {
g_set_error_literal (&info->error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
"Cannot perform this operation while connected");
@@ -433,6 +433,7 @@ real_do_enable_power_up_done (MMGenericGsm *gsm,
MMCallbackInfo *info)
{
MMModemSierraGsmPrivate *priv = MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm);
+ char *driver = NULL;
if (error) {
/* Chain up to parent */
@@ -440,11 +441,17 @@ real_do_enable_power_up_done (MMGenericGsm *gsm,
return;
}
- /* Some Sierra devices return OK on +CFUN=1 right away but need some time
- * to finish initialization.
+ /* Old Sierra devices (like the PCMCIA-based 860) return OK on +CFUN=1 right
+ * away but need some time to finish initialization. Anything driven by
+ * 'sierra' is new enough to need no delay.
*/
- g_warn_if_fail (priv->enable_wait_id == 0);
- priv->enable_wait_id = g_timeout_add_seconds (10, sierra_enabled, info);
+ g_object_get (G_OBJECT (gsm), MM_MODEM_DRIVER, &driver, NULL);
+ if (g_strcmp0 (driver, "sierra") == 0)
+ sierra_enabled (info);
+ else {
+ g_warn_if_fail (priv->enable_wait_id == 0);
+ priv->enable_wait_id = g_timeout_add_seconds (10, sierra_enabled, info);
+ }
}
static void
@@ -497,7 +504,7 @@ do_enable_power_up_check_needed (MMGenericGsm *self,
info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data);
/* Get port */
- primary = mm_generic_gsm_get_at_port (self, MM_PORT_TYPE_PRIMARY);
+ primary = mm_generic_gsm_get_at_port (self, MM_AT_PORT_FLAG_PRIMARY);
g_assert (primary);
/* Get current functionality status */
@@ -505,47 +512,27 @@ do_enable_power_up_check_needed (MMGenericGsm *self,
mm_at_serial_port_queue_command (primary, "+CFUN?", 3, get_current_functionality_status_cb, info);
}
-static gboolean
-grab_port (MMModem *modem,
- const char *subsys,
- const char *name,
- MMPortType suggested_type,
- gpointer user_data,
- GError **error)
-{
- MMGenericGsm *gsm = MM_GENERIC_GSM (modem);
- MMPortType ptype = MM_PORT_TYPE_IGNORED;
- MMPort *port;
-
- if (suggested_type == MM_PORT_TYPE_UNKNOWN) {
- if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY))
- ptype = MM_PORT_TYPE_PRIMARY;
- else if (!mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY))
- ptype = MM_PORT_TYPE_SECONDARY;
- } else
- ptype = suggested_type;
-
- port = mm_generic_gsm_grab_port (gsm, subsys, name, ptype, error);
-
- if (port) {
- if (MM_IS_AT_SERIAL_PORT (port)) {
- GRegex *regex;
+static void
+port_grabbed (MMGenericGsm *gsm,
+ MMPort *port,
+ MMAtPortFlags pflags,
+ gpointer user_data)
+{
+ GRegex *regex;
- g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL);
+ if (MM_IS_AT_SERIAL_PORT (port)) {
+ g_object_set (G_OBJECT (port), MM_PORT_CARRIER_DETECT, FALSE, NULL);
- regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
- mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL);
- g_regex_unref (regex);
+ regex = g_regex_new ("\\r\\n\\+PACSP0\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ mm_at_serial_port_add_unsolicited_msg_handler (MM_AT_SERIAL_PORT (port), regex, NULL, NULL, NULL);
+ g_regex_unref (regex);
- /* Add Icera-specific handlers */
- mm_modem_icera_register_unsolicted_handlers (MM_MODEM_ICERA (gsm), MM_AT_SERIAL_PORT (port));
- } else if (mm_port_get_subsys (port) == MM_PORT_SUBSYS_NET) {
- MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm)->has_net = TRUE;
- g_object_set (G_OBJECT (gsm), MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_DHCP, NULL);
- }
+ /* Add Icera-specific handlers */
+ mm_modem_icera_register_unsolicted_handlers (MM_MODEM_ICERA (gsm), MM_AT_SERIAL_PORT (port));
+ } else if (mm_port_get_subsys (port) == MM_PORT_SUBSYS_NET) {
+ MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm)->has_net = TRUE;
+ g_object_set (G_OBJECT (gsm), MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_DHCP, NULL);
}
-
- return !!port;
}
static void
@@ -740,7 +727,7 @@ do_disconnect (MMGenericGsm *gsm,
MMAtSerialPort *primary;
char *command;
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
+ primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY);
g_assert (primary);
/* If we have a net interface, deactivate it */
@@ -801,7 +788,7 @@ do_disable (MMModem *modem,
(GCallback)callback,
user_data);
- primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
+ primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_AT_PORT_FLAG_PRIMARY);
g_assert (primary);
/* Turn off unsolicited responses */
@@ -872,7 +859,6 @@ get_icera_private (MMModemIcera *icera)
static void
modem_init (MMModem *modem_class)
{
- modem_class->grab_port = grab_port;
modem_class->connect = do_connect;
modem_class->disable = do_disable;
modem_class->get_ip4_config = get_ip4_config;
@@ -919,6 +905,7 @@ mm_modem_sierra_gsm_class_init (MMModemSierraGsmClass *klass)
g_type_class_add_private (object_class, sizeof (MMModemSierraGsmPrivate));
object_class->dispose = dispose;
+ gsm_class->port_grabbed = port_grabbed;
gsm_class->do_enable_power_up_check_needed = do_enable_power_up_check_needed;
gsm_class->do_enable_power_up_done = real_do_enable_power_up_done;
gsm_class->set_allowed_mode = set_allowed_mode;