diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-10-05 12:59:34 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-10-05 14:19:25 +0200 |
commit | 8a23ac8a554c9d37d2b0fe016537ea913832fa6e (patch) | |
tree | dd8c8e173bcba988d655fcb67423334e87faee0e | |
parent | 0f8f345d79192a329161298ab4742dfdab548b1b (diff) |
broadband-modem: fall back to +CSQ if +CIND reports no signal
This is the port to git master of the following commit:
commit 8bd6903c30e52e65a4afbebf85ba59e6c0fada71
Author: Dan Williams <dcbw@redhat.com>
Date: Thu Oct 4 09:34:01 2012 -0500
gsm: fall back to +CSQ if +CIND reports no signal (bgo #636040)
Some devices say they support +CIND signal reporting, but either
actually don't, or they report signal for a non-current access
technology that we don't care about. So if +CIND reports zero
signal, fall back to +CSQ.
-rw-r--r-- | src/mm-broadband-modem.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index aa892ad0..36d73a65 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -1424,28 +1424,19 @@ signal_quality_cind_ready (MMBroadbandModem *self, GError *error = NULL; const gchar *result; GByteArray *indicators; + guint quality; result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error); if (!error) indicators = mm_3gpp_parse_cind_read_response (result, &error); - if (error) + if (error) { g_simple_async_result_take_error (ctx->result, error); - else if (indicators->len >= self->priv->modem_cind_indicator_signal_quality) { - guint quality; - - quality = g_array_index (indicators, - guint8, - self->priv->modem_cind_indicator_signal_quality); - quality = normalize_ciev_cind_signal_quality (quality, - self->priv->modem_cind_min_signal_quality, - self->priv->modem_cind_max_signal_quality); - g_simple_async_result_set_op_res_gpointer (ctx->result, - GUINT_TO_POINTER (quality), - NULL); + signal_quality_context_complete_and_free (ctx); + return; + } - g_byte_array_free (indicators, TRUE); - } else + if (indicators->len < self->priv->modem_cind_indicator_signal_quality) { g_simple_async_result_set_error (ctx->result, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, @@ -1453,7 +1444,32 @@ signal_quality_cind_ready (MMBroadbandModem *self, "signal index (%u) outside received range (0-%u)", self->priv->modem_cind_indicator_signal_quality, indicators->len); + g_byte_array_free (indicators, TRUE); + signal_quality_context_complete_and_free (ctx); + return; + } + + quality = g_array_index (indicators, + guint8, + self->priv->modem_cind_indicator_signal_quality); + g_byte_array_free (indicators, TRUE); + quality = normalize_ciev_cind_signal_quality (quality, + self->priv->modem_cind_min_signal_quality, + self->priv->modem_cind_max_signal_quality); + + /* Some LTE devices say they support signal via CIND, + * but always report zero even though they have signal. So + * if we get zero signal, try CSQ too. (bgo #636040) + */ + if (quality == 0) { + signal_quality_csq (ctx); + return; + } + + g_simple_async_result_set_op_res_gpointer (ctx->result, + GUINT_TO_POINTER (quality), + NULL); signal_quality_context_complete_and_free (ctx); } |