diff options
author | Dan Williams <dcbw@redhat.com> | 2013-03-25 15:49:08 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-03-25 15:49:08 -0500 |
commit | 95b46c16f1ddb5102876ad87ade47b974cd45e34 (patch) | |
tree | 0d0981d3b689605c77c2ac579472681e7e2d1f35 | |
parent | 8ebce66f966c18bea0114206bcfeacdc08023c84 (diff) |
broadband-modem-sierra: add after-sim-unlock delay
Older devices may crash if asked to connect right after sending the
PIN and unlocking the SIM; they simply stop responding to AT commands
around the first request for access technology and then reboot. A
delay seems prevents this behavior.
Since it's not uncommon to require a delay after SIM unlock, add one
for newer sierra_net devices as well, even though we're not quite
sure if they need one or not. It doesn't hurt, at least.
-rw-r--r-- | plugins/sierra/mm-broadband-modem-sierra.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/plugins/sierra/mm-broadband-modem-sierra.c b/plugins/sierra/mm-broadband-modem-sierra.c index 7a8ba0c1..90e4106e 100644 --- a/plugins/sierra/mm-broadband-modem-sierra.c +++ b/plugins/sierra/mm-broadband-modem-sierra.c @@ -748,6 +748,54 @@ set_allowed_modes (MMIfaceModem *self, } /*****************************************************************************/ +/* After SIM unlock (Modem interface) */ + +static gboolean +modem_after_sim_unlock_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + return TRUE; +} + +static gboolean +after_sim_unlock_wait_cb (GSimpleAsyncResult *result) +{ + g_simple_async_result_complete (result); + g_object_unref (result); + return FALSE; +} + +static void +modem_after_sim_unlock (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; + guint timeout = 8; + const gchar **drivers; + guint i; + + /* A short wait is necessary for SIM to become ready, otherwise some older + * cards (AC881) crash if asked to connect immediately after sending the + * PIN. Assume sierra_net driven devices are better and don't need as long + * a delay. + */ + drivers = mm_base_modem_get_drivers (MM_BASE_MODEM (self)); + for (i = 0; drivers[i]; i++) { + if (g_str_equal (drivers[i], "sierra_net")) + timeout = 3; + } + + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + modem_after_sim_unlock); + + g_timeout_add_seconds (timeout, (GSourceFunc)after_sim_unlock_wait_cb, result); +} + +/*****************************************************************************/ /* Load own numbers (Modem interface) */ static GStrv @@ -1463,6 +1511,8 @@ iface_modem_init (MMIfaceModem *iface) iface->modem_power_down_finish = modem_power_down_finish; iface->create_sim = mm_common_sierra_create_sim; iface->create_sim_finish = mm_common_sierra_create_sim_finish; + iface->modem_after_sim_unlock = modem_after_sim_unlock; + iface->modem_after_sim_unlock_finish = modem_after_sim_unlock_finish; iface->create_bearer = modem_create_bearer; iface->create_bearer_finish = modem_create_bearer_finish; } |