broadband-modem: open QCDM port for signal checking when needed

This commit is contained in:
Dan Williams
2017-03-06 08:57:40 -06:00
parent 977d5ac6ce
commit aa87775a81

View File

@@ -1749,7 +1749,8 @@ qcdm_evdo_pilot_sets_log_handle (MMPortSerialQcdm *port,
typedef struct { typedef struct {
MMBroadbandModem *self; MMBroadbandModem *self;
GSimpleAsyncResult *result; GSimpleAsyncResult *result;
MMPortSerial *port; MMPortSerial *at_port;
MMPortSerial *qcdm_port;
} SignalQualityContext; } SignalQualityContext;
static void static void
@@ -1758,8 +1759,11 @@ signal_quality_context_complete_and_free (SignalQualityContext *ctx)
g_simple_async_result_complete_in_idle (ctx->result); g_simple_async_result_complete_in_idle (ctx->result);
g_object_unref (ctx->result); g_object_unref (ctx->result);
g_object_unref (ctx->self); g_object_unref (ctx->self);
if (ctx->port) g_clear_object (&ctx->at_port);
g_object_unref (ctx->port); if (ctx->qcdm_port) {
mm_port_serial_close (ctx->qcdm_port);
g_object_unref (ctx->qcdm_port);
}
g_free (ctx); g_free (ctx);
} }
@@ -1854,7 +1858,7 @@ signal_quality_csq (SignalQualityContext *ctx)
{ {
mm_base_modem_at_sequence_full ( mm_base_modem_at_sequence_full (
MM_BASE_MODEM (ctx->self), MM_BASE_MODEM (ctx->self),
MM_PORT_SERIAL_AT (ctx->port), MM_PORT_SERIAL_AT (ctx->at_port),
signal_quality_csq_sequence, signal_quality_csq_sequence,
NULL, /* response_processor_context */ NULL, /* response_processor_context */
NULL, /* response_processor_context_free */ NULL, /* response_processor_context_free */
@@ -1903,7 +1907,7 @@ signal_quality_cind_ready (MMBroadbandModem *self,
indicators = mm_3gpp_parse_cind_read_response (result, &error); indicators = mm_3gpp_parse_cind_read_response (result, &error);
if (!indicators) { if (!indicators) {
mm_dbg ("(%s) Could not parse CIND signal quality results: %s", 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); error->message);
g_clear_error (&error); g_clear_error (&error);
goto try_csq; goto try_csq;
@@ -1912,7 +1916,7 @@ signal_quality_cind_ready (MMBroadbandModem *self,
if (indicators->len < self->priv->modem_cind_indicator_signal_quality) { if (indicators->len < self->priv->modem_cind_indicator_signal_quality) {
mm_dbg ("(%s) Could not parse CIND signal quality results; signal " mm_dbg ("(%s) Could not parse CIND signal quality results; signal "
"index (%u) outside received range (0-%u)", "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, self->priv->modem_cind_indicator_signal_quality,
indicators->len); indicators->len);
} else { } else {
@@ -1947,7 +1951,7 @@ static void
signal_quality_cind (SignalQualityContext *ctx) signal_quality_cind (SignalQualityContext *ctx)
{ {
mm_base_modem_at_command_full (MM_BASE_MODEM (ctx->self), mm_base_modem_at_command_full (MM_BASE_MODEM (ctx->self),
MM_PORT_SERIAL_AT (ctx->port), MM_PORT_SERIAL_AT (ctx->at_port),
"+CIND?", "+CIND?",
3, 3,
FALSE, FALSE,
@@ -2045,7 +2049,7 @@ signal_quality_qcdm (SignalQualityContext *ctx)
pilot_sets->len = qcdm_cmd_pilot_sets_new ((char *) pilot_sets->data, 25); pilot_sets->len = qcdm_cmd_pilot_sets_new ((char *) pilot_sets->data, 25);
g_assert (pilot_sets->len); g_assert (pilot_sets->len);
mm_port_serial_qcdm_command (MM_PORT_SERIAL_QCDM (ctx->port), mm_port_serial_qcdm_command (MM_PORT_SERIAL_QCDM (ctx->qcdm_port),
pilot_sets, pilot_sets,
3, 3,
NULL, NULL,
@@ -2071,8 +2075,8 @@ modem_load_signal_quality (MMIfaceModem *self,
modem_load_signal_quality); modem_load_signal_quality);
/* Check whether we can get a non-connected AT port */ /* Check whether we can get a non-connected AT port */
ctx->port = (MMPortSerial *)mm_base_modem_get_best_at_port (MM_BASE_MODEM (self), &error); ctx->at_port = (MMPortSerial *)mm_base_modem_get_best_at_port (MM_BASE_MODEM (self), &error);
if (ctx->port) { if (ctx->at_port) {
if (MM_BROADBAND_MODEM (self)->priv->modem_cind_supported && if (MM_BROADBAND_MODEM (self)->priv->modem_cind_supported &&
CIND_INDICATOR_IS_VALID (MM_BROADBAND_MODEM (self)->priv->modem_cind_indicator_signal_quality)) CIND_INDICATOR_IS_VALID (MM_BROADBAND_MODEM (self)->priv->modem_cind_indicator_signal_quality))
signal_quality_cind (ctx); signal_quality_cind (ctx);
@@ -2082,11 +2086,19 @@ modem_load_signal_quality (MMIfaceModem *self,
} }
/* If no best AT port available (all connected), try with QCDM ports */ /* If no best AT port available (all connected), try with QCDM ports */
ctx->port = (MMPortSerial *)mm_base_modem_get_port_qcdm (MM_BASE_MODEM (self)); ctx->qcdm_port = (MMPortSerial *)mm_base_modem_peek_port_qcdm (MM_BASE_MODEM (self));
if (ctx->port) { if (ctx->qcdm_port) {
g_error_free (error); g_clear_error (&error);
signal_quality_qcdm (ctx);
return; /* Need to open QCDM port as it may be closed/blocked */
if (mm_port_serial_open (MM_PORT_SERIAL (ctx->qcdm_port), &error)) {
g_object_ref (ctx->qcdm_port);
signal_quality_qcdm (ctx);
return;
}
ctx->qcdm_port = NULL;
mm_dbg ("Couldn't open QCDM port: %s", error->message);
} }
/* Return the error we got when getting best AT port */ /* Return the error we got when getting best AT port */