diff options
author | Dan Williams <dcbw@redhat.com> | 2011-04-18 17:38:39 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2011-04-18 17:38:39 -0500 |
commit | fca4d3aa37e9a22921d1b7cfb93325bf6cc91f4e (patch) | |
tree | 5423d55070b995133c142b9320fb3a9d92215381 /src | |
parent | 5dadfa4c214be79e704eb61c135893f93a705d3a (diff) |
gsm: return success if unlocked but doesn't allow subsequent CPIN commands
If the modem for some reason returns ERROR for a +CPIN when it's
unlocked, and subsequent PIN post-unlock pin checks return READY,
just treat the modem as unlocked don't return the +CPIN error.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 4b298d82..ab6e0da6 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -1958,8 +1958,17 @@ pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data) /* If we have a saved error from sending PIN/PUK, return that to callers */ saved_error = mm_callback_info_get_data (info, SAVED_ERROR_TAG); if (saved_error) { - g_clear_error (&info->error); - info->error = saved_error; + if (info->modem && !mm_modem_base_get_unlock_required (MM_MODEM_BASE (info->modem))) { + /* Original unlock failed but the modem is actually unlocked, so + * return success. Sometimes happens if the modem doesn't allow + * CPIN="xxxx" when it's already unlocked and returns an error. + * Do nothing. + */ + } else { + /* Unlock failed after recheck, return original error */ + g_clear_error (&info->error); + info->error = g_error_copy (saved_error); + } } mm_callback_info_schedule (info); @@ -1984,7 +1993,8 @@ send_puk_done (MMAtSerialPort *port, * when we're done rechecking CPIN status. */ mm_callback_info_set_data (info, SAVED_ERROR_TAG, - g_error_copy (error), NULL); + g_error_copy (error), + (GDestroyNotify) g_error_free); } } @@ -2047,7 +2057,8 @@ send_pin_done (MMAtSerialPort *port, * when we're done rechecking CPIN status. */ mm_callback_info_set_data (info, SAVED_ERROR_TAG, - g_error_copy (error), NULL); + g_error_copy (error), + (GDestroyNotify) g_error_free); } } |