From 814febe1fd9baacdb33c79f11c140187df36c4f1 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 30 Oct 2012 16:16:25 -0500 Subject: sierra: fix CFUN power up delay handling 1) all Sierra devices appear to require short delay after powering up, otherwise subsequent commands may return errors. Older devices need longer so ensure new devices are penalized just for being new. 2) When the modem is already in full functionality status and no power up command was sent, there's no need to delay, which was happening regardless of what state the modem was already in. Detect whether the power up was actually executed (response and error will be NULL) and only delay if it was executed. --- plugins/mm-modem-sierra-gsm.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c index 3737bf5e8..67369542d 100644 --- a/plugins/mm-modem-sierra-gsm.c +++ b/plugins/mm-modem-sierra-gsm.c @@ -582,6 +582,7 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, { MMModemSierraGsmPrivate *priv = MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm); char *driver = NULL; + guint seconds = 5; if (error) { /* Chain up to parent */ @@ -589,17 +590,28 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, return; } - /* 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. + if (response == NULL) { + /* If both error and response are NULL, that means the modem was already + * powered up and the power-up command was skipped. So we don't need to + * wait for the modem to settle after CFUN=1 is sent. + */ + sierra_enabled (info); + return; + } + + /* Most Sierra devices return OK immediately in response to CFUN=1 but + * need some time to finish powering up. */ + g_warn_if_fail (priv->enable_wait_id == 0); 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); + if (g_strcmp0 (driver, "sierra") != 0) { + /* more time for older devices like the AC860, which aren't driven + * by the 'sierra' driver. + */ + seconds = 10; } + + priv->enable_wait_id = g_timeout_add_seconds (seconds, sierra_enabled, info); } static void -- cgit v1.2.1