gsm: try initial PIN check a few times in case SIM is busy
This commit is contained in:
@@ -51,6 +51,8 @@ typedef struct {
|
|||||||
|
|
||||||
gboolean valid;
|
gboolean valid;
|
||||||
gboolean pin_checked;
|
gboolean pin_checked;
|
||||||
|
guint32 pin_check_tries;
|
||||||
|
guint pin_check_timeout;
|
||||||
|
|
||||||
char *oper_code;
|
char *oper_code;
|
||||||
char *oper_name;
|
char *oper_name;
|
||||||
@@ -297,6 +299,20 @@ check_valid (MMGenericGsm *self)
|
|||||||
mm_modem_base_set_valid (MM_MODEM_BASE (self), new_valid);
|
mm_modem_base_set_valid (MM_MODEM_BASE (self), new_valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data);
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
pin_check_again (gpointer user_data)
|
||||||
|
{
|
||||||
|
MMGenericGsm *self = MM_GENERIC_GSM (user_data);
|
||||||
|
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self);
|
||||||
|
|
||||||
|
priv->pin_check_timeout = 0;
|
||||||
|
mm_generic_gsm_check_pin (self, initial_pin_check_done, GUINT_TO_POINTER (TRUE));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data)
|
initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data)
|
||||||
{
|
{
|
||||||
@@ -306,10 +322,18 @@ initial_pin_check_done (MMModem *modem, GError *error, gpointer user_data)
|
|||||||
/* modem could have been removed before we get here, in which case
|
/* modem could have been removed before we get here, in which case
|
||||||
* 'modem' will be NULL.
|
* 'modem' will be NULL.
|
||||||
*/
|
*/
|
||||||
if (modem) {
|
if (!modem)
|
||||||
g_return_if_fail (MM_IS_GENERIC_GSM (modem));
|
return;
|
||||||
priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
|
|
||||||
|
|
||||||
|
g_return_if_fail (MM_IS_GENERIC_GSM (modem));
|
||||||
|
priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
|
||||||
|
|
||||||
|
if (error && priv->pin_check_tries++ < 3) {
|
||||||
|
/* Try it again a few times */
|
||||||
|
if (priv->pin_check_timeout)
|
||||||
|
g_source_remove (priv->pin_check_timeout);
|
||||||
|
priv->pin_check_timeout = g_timeout_add_seconds (2, pin_check_again, modem);
|
||||||
|
} else {
|
||||||
priv->pin_checked = TRUE;
|
priv->pin_checked = TRUE;
|
||||||
if (close_port)
|
if (close_port)
|
||||||
mm_serial_port_close (priv->primary);
|
mm_serial_port_close (priv->primary);
|
||||||
@@ -2284,6 +2308,9 @@ finalize (GObject *object)
|
|||||||
|
|
||||||
mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (object));
|
mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (object));
|
||||||
|
|
||||||
|
if (priv->pin_check_timeout)
|
||||||
|
g_source_remove (priv->pin_check_timeout);
|
||||||
|
|
||||||
g_free (priv->oper_code);
|
g_free (priv->oper_code);
|
||||||
g_free (priv->oper_name);
|
g_free (priv->oper_name);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user