diff options
author | Dan Williams <dcbw@redhat.com> | 2013-04-24 12:09:29 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-05-09 10:26:24 -0500 |
commit | 9947266236c38529918ac3d9f529b6cbd9a25cf5 (patch) | |
tree | 7c456ad22d4445311d9deeeb62b5f3a505dcfb18 | |
parent | a2df292860ff2b63d9f015420e0280d4ae69d056 (diff) | |
download | ModemManager-dcbw/diag-log.tar.gz |
broadband-modem: prefer QCDM signal quality checks for CDMA-only modemsdcbw/diag-log
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.
-rw-r--r-- | src/mm-broadband-modem.c | 39 |
1 files 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); |