From 021ca1244e2be8afcf6bdb552866263dc20c9285 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 4 Mar 2010 19:01:13 -0800 Subject: [PATCH] gsm: postpone PIN/PUK success reply until we know updated unlock status Don't return until we know what the updated lock status is. Fixes an issue where callers that send the PIN before the modem is enabled (remember, some modems can't be enabled until the PIN is entered, so sometimes we have to send the PIN before it's enabled) would get the reply too early and get failures from other operations. --- src/mm-generic-gsm.c | 45 +++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 6f88a031..9e38b29a 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -799,24 +799,25 @@ get_card_info (MMModem *modem, mm_serial_port_queue_command_cached (priv->primary, "+CGMR", 3, get_version_done, info); } +#define PIN_CLOSE_PORT_TAG "close-port" + static void pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data) { - gboolean close_port = !!user_data; + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + gboolean close_port = !!mm_callback_info_get_data (info, PIN_CLOSE_PORT_TAG); /* modem could have been removed before we get here, in which case * 'modem' will be NULL. */ - if (modem) { - g_return_if_fail (MM_IS_GENERIC_GSM (modem)); + info->error = mm_modem_check_removed (modem, error); - if (close_port) - mm_serial_port_close (MM_GENERIC_GSM_GET_PRIVATE (modem)->primary); - } + if (modem && close_port) + mm_serial_port_close (MM_GENERIC_GSM_GET_PRIVATE (modem)->primary); + + mm_callback_info_schedule (info); } -#define PIN_CLOSE_PORT_TAG "close-port" - static void send_puk_done (MMSerialPort *port, GString *response, @@ -826,15 +827,16 @@ send_puk_done (MMSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; gboolean close_port = !!mm_callback_info_get_data (info, PIN_CLOSE_PORT_TAG); - if (error) + if (error) { info->error = g_error_copy (error); + mm_callback_info_schedule (info); + if (close_port) + mm_serial_port_close (port); + return; + } - /* Get latest PUK status */ - mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), - pin_puk_recheck_done, - GUINT_TO_POINTER (close_port)); - - mm_callback_info_schedule (info); + /* Get latest PIN status */ + mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), pin_puk_recheck_done, info); } static void @@ -886,15 +888,16 @@ send_pin_done (MMSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; gboolean close_port = !!mm_callback_info_get_data (info, PIN_CLOSE_PORT_TAG); - if (error) + if (error) { info->error = g_error_copy (error); + mm_callback_info_schedule (info); + if (close_port) + mm_serial_port_close (port); + return; + } /* Get latest PIN status */ - mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), - pin_puk_recheck_done, - GUINT_TO_POINTER (close_port)); - - mm_callback_info_schedule (info); + mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), pin_puk_recheck_done, info); } static void