From 9947266236c38529918ac3d9f529b6cbd9a25cf5 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 24 Apr 2013 12:09:29 -0500 Subject: broadband-modem: prefer QCDM signal quality checks for CDMA-only modems Now that we can get EVDO signal strength too, just use QCDM if we have it. For CDMA devices +CSQ is ambiguous because it almost always reports only CDMA1x signal strength, not EVDO strength. So attempting to use AT commands for signal strength always returns the wrong result when the device is using EVDO. --- src/mm-broadband-modem.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 93c772d23..eb9ed9fd4 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -1553,7 +1553,8 @@ modem_load_supported_modes (MMIfaceModem *self, typedef struct { MMBroadbandModem *self; GSimpleAsyncResult *result; - MMSerialPort *port; + MMSerialPort *at_port; + MMSerialPort *qcdm_port; } SignalQualityContext; static void @@ -1562,8 +1563,10 @@ signal_quality_context_complete_and_free (SignalQualityContext *ctx) g_simple_async_result_complete_in_idle (ctx->result); g_object_unref (ctx->result); g_object_unref (ctx->self); - if (ctx->port) - g_object_unref (ctx->port); + if (ctx->at_port) + g_object_unref (ctx->at_port); + if (ctx->qcdm_port) + g_object_unref (ctx->qcdm_port); g_free (ctx); } @@ -1643,7 +1646,7 @@ signal_quality_csq (SignalQualityContext *ctx) { mm_base_modem_at_sequence_full ( MM_BASE_MODEM (ctx->self), - MM_AT_SERIAL_PORT (ctx->port), + MM_AT_SERIAL_PORT (ctx->at_port), signal_quality_csq_sequence, NULL, /* response_processor_context */ NULL, /* response_processor_context_free */ @@ -1692,7 +1695,7 @@ signal_quality_cind_ready (MMBroadbandModem *self, indicators = mm_3gpp_parse_cind_read_response (result, &error); if (!indicators) { mm_dbg ("(%s) Could not parse CIND signal quality results: %s", - mm_port_get_device (MM_PORT (ctx->port)), + mm_port_get_device (MM_PORT (ctx->at_port)), error->message); g_clear_error (&error); goto try_csq; @@ -1701,7 +1704,7 @@ signal_quality_cind_ready (MMBroadbandModem *self, if (indicators->len < self->priv->modem_cind_indicator_signal_quality) { mm_dbg ("(%s) Could not parse CIND signal quality results; signal " "index (%u) outside received range (0-%u)", - mm_port_get_device (MM_PORT (ctx->port)), + mm_port_get_device (MM_PORT (ctx->at_port)), self->priv->modem_cind_indicator_signal_quality, indicators->len); } else { @@ -1736,7 +1739,7 @@ static void signal_quality_cind (SignalQualityContext *ctx) { mm_base_modem_at_command_full (MM_BASE_MODEM (ctx->self), - MM_AT_SERIAL_PORT (ctx->port), + MM_AT_SERIAL_PORT (ctx->at_port), "+CIND?", 3, FALSE, @@ -1826,7 +1829,7 @@ signal_quality_qcdm (SignalQualityContext *ctx) pilot_sets->len = qcdm_cmd_pilot_sets_new ((char *) pilot_sets->data, 25); g_assert (pilot_sets->len); - mm_qcdm_serial_port_queue_command (MM_QCDM_SERIAL_PORT (ctx->port), + mm_qcdm_serial_port_queue_command (MM_QCDM_SERIAL_PORT (ctx->qcdm_port), pilot_sets, 3, NULL, @@ -1856,9 +1859,15 @@ modem_load_signal_quality (MMIfaceModem *self, user_data, modem_load_signal_quality); - /* Check whether we can get a non-connected AT port */ - ctx->port = (MMSerialPort *)mm_base_modem_get_best_at_port (MM_BASE_MODEM (self), &error); - if (ctx->port) { + /* Prefer QCDM signal quality checks for CDMA-only modems that have a QCDM port */ + ctx->qcdm_port = (MMSerialPort *)mm_base_modem_get_port_qcdm (MM_BASE_MODEM (self)); + if (mm_iface_modem_is_cdma_only (self) && ctx->qcdm_port) { + signal_quality_qcdm (ctx); + return; + } + + ctx->at_port = (MMSerialPort *)mm_base_modem_get_best_at_port (MM_BASE_MODEM (self), &error); + if (ctx->at_port) { if (MM_BROADBAND_MODEM (self)->priv->modem_cind_supported) signal_quality_cind (ctx); else @@ -1866,14 +1875,6 @@ modem_load_signal_quality (MMIfaceModem *self, return; } - /* If no best AT port available (all connected), try with QCDM ports */ - ctx->port = (MMSerialPort *)mm_base_modem_get_port_qcdm (MM_BASE_MODEM (self)); - if (ctx->port) { - g_error_free (error); - signal_quality_qcdm (ctx); - return; - } - /* Return the error we got when getting best AT port */ g_simple_async_result_take_error (ctx->result, error); signal_quality_context_complete_and_free (ctx); -- cgit v1.2.1