summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrathmesh Prabhu <pprabhu@chromium.org>2014-06-18 07:24:57 -0700
committerDan Williams <dcbw@redhat.com>2014-06-18 10:05:39 -0500
commit6491d82655ac0ac9dacc6abd4c24f51e3e93443b (patch)
tree68e7237102499b4d3fca59577cd685bdca13b689
parent9e5020901977456987430e74a18be83fa56cbc4d (diff)
bearer-mbim: disconnect attempt should succeed if bearer is already disconnected
When trying to disconnect bearer, if the modem responds with MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED, take it to mean that the bearer has already been disconnected.
-rw-r--r--src/mm-bearer-mbim.c64
1 files changed, 39 insertions, 25 deletions
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index c25b2811..55305bb8 100644
--- a/src/mm-bearer-mbim.c
+++ b/src/mm-bearer-mbim.c
@@ -958,35 +958,49 @@ disconnect_set_ready (MbimDevice *device,
guint32 nw_error;
response = mbim_device_command_finish (device, res, &error);
- if (response &&
- (mbim_message_command_done_get_result (response, &error) ||
- error->code == MBIM_STATUS_ERROR_FAILURE)) {
+ if (response) {
GError *inner_error = NULL;
+ gboolean result = FALSE, parsed_result = FALSE;
+
+ result = mbim_message_command_done_get_result (response, &error);
+ /* Parse the response only for the cases we need to */
+ if (result ||
+ g_error_matches (error, MBIM_STATUS_ERROR, MBIM_STATUS_ERROR_FAILURE) ||
+ g_error_matches (error, MBIM_STATUS_ERROR,
+ MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED)) {
+ parsed_result = mbim_message_connect_response_parse (
+ response,
+ &session_id,
+ &activation_state,
+ NULL, /* voice_call_state */
+ NULL, /* ip_type */
+ NULL, /* context_type */
+ &nw_error,
+ &inner_error);
+ }
- if (mbim_message_connect_response_parse (
- response,
- &session_id,
- &activation_state,
- NULL, /* voice_call_state */
- NULL, /* ip_type */
- NULL, /* context_type */
- &nw_error,
- &inner_error)) {
+ /* Now handle different response / error cases */
+ if (parsed_result) {
+ mm_dbg ("Session ID '%u': %s",
+ session_id,
+ mbim_activation_state_get_string (activation_state));
+ } else if (g_error_matches (error,
+ MBIM_STATUS_ERROR,
+ MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED)) {
+ mm_dbg ("Session ID '%u' already disconnected.", session_id);
+ g_clear_error (&error);
+ g_clear_error (&inner_error);
+ } else if (g_error_matches (error, MBIM_STATUS_ERROR, MBIM_STATUS_ERROR_FAILURE)) {
if (nw_error) {
- if (error)
- g_error_free (error);
+ g_error_free (error);
error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error);
- } else
- mm_dbg ("Session ID '%u': %s",
- session_id,
- mbim_activation_state_get_string (activation_state));
- } else {
- /* Prefer the error from the result to the parsing error */
- if (!error)
- error = inner_error;
- else
- g_error_free (inner_error);
- }
+ }
+ } /* else: For other errors, give precedence to error over nw_error */
+
+ /* Give precedence to original error over parsing error */
+ if (!error && inner_error)
+ error = g_error_copy (inner_error);
+ g_clear_error (&inner_error);
}
if (response)