aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-base-call.c2
-rw-r--r--src/mm-base-modem-at.c4
-rw-r--r--src/mm-base-modem.c64
-rw-r--r--src/mm-base-modem.h5
-rw-r--r--src/mm-base-sms.c4
-rw-r--r--src/mm-broadband-bearer.c2
-rw-r--r--src/mm-broadband-modem.c4
-rw-r--r--src/plugins/sierra/mm-broadband-bearer-sierra.c2
8 files changed, 60 insertions, 27 deletions
diff --git a/src/mm-base-call.c b/src/mm-base-call.c
index 85128ce0..ab77a564 100644
--- a/src/mm-base-call.c
+++ b/src/mm-base-call.c
@@ -1052,7 +1052,7 @@ call_start (MMBaseCall *self,
task = g_task_new (self, NULL, callback, user_data);
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self->priv->modem), &error));
+ port = mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self->priv->modem), &error);
if (!port) {
g_task_return_error (task, error);
g_object_unref (task);
diff --git a/src/mm-base-modem-at.c b/src/mm-base-modem-at.c
index db7eaaa7..173a7f7c 100644
--- a/src/mm-base-modem-at.c
+++ b/src/mm-base-modem-at.c
@@ -323,7 +323,7 @@ mm_base_modem_at_sequence (MMBaseModem *self,
GError *error = NULL;
/* No port given, so we'll try to guess which is best */
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (self, &error));
+ port = mm_base_modem_peek_best_at_port (self, &error);
if (!port) {
g_task_report_error (self, callback, user_data, mm_base_modem_at_sequence, error);
return;
@@ -599,7 +599,7 @@ mm_base_modem_at_command (MMBaseModem *self,
GError *error = NULL;
/* No port given, so we'll try to guess which is best */
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (self, &error));
+ port = mm_base_modem_peek_best_at_port (self, &error);
if (!port) {
g_task_report_error (self, callback, user_data, mm_base_modem_at_command, error);
return;
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index 3ef4905f..7cda12b8 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -1102,35 +1102,67 @@ mm_base_modem_peek_data_ports (MMBaseModem *self)
return self->priv->data;
}
-MMPortSerialAt *
-mm_base_modem_get_best_at_port (MMBaseModem *self,
- GError **error)
+MMIfacePortAt *
+mm_base_modem_get_best_at_port (MMBaseModem *self,
+ GError **error)
{
- MMPortSerialAt *best;
+ MMIfacePortAt *best;
best = mm_base_modem_peek_best_at_port (self, error);
return (best ? g_object_ref (best) : NULL);
}
-MMPortSerialAt *
-mm_base_modem_peek_best_at_port (MMBaseModem *self,
- GError **error)
+MMIfacePortAt *
+mm_base_modem_peek_best_at_port (MMBaseModem *self,
+ GError **error)
{
+ gboolean supported;
+
+#if defined WITH_MBIM
+ /* Prefer an AT-capable MBIM port instead of a serial port */
+ if (self->priv->mbim) {
+ GList *l;
+
+ for (l = self->priv->mbim; l; l = g_list_next (l)) {
+ if (MM_IS_IFACE_PORT_AT (l->data) &&
+ mm_iface_port_at_check_support (MM_IFACE_PORT_AT (l->data), &supported, NULL) &&
+ supported)
+ return MM_IFACE_PORT_AT (l->data);
+ }
+ }
+#endif
+
+#if defined WITH_QMI
+ /* Prefer an AT-capable QMI port instead of a serial port */
+ if (self->priv->qmi) {
+ GList *l;
+
+ for (l = self->priv->qmi; l; l = g_list_next (l)) {
+ if (MM_IS_IFACE_PORT_AT (l->data) &&
+ mm_iface_port_at_check_support (MM_IFACE_PORT_AT (l->data), &supported, NULL) &&
+ supported)
+ return MM_IFACE_PORT_AT (l->data);
+ }
+ }
+#endif
+
/* Decide which port to use */
- if (self->priv->primary &&
- !mm_port_get_connected (MM_PORT (self->priv->primary)))
- return self->priv->primary;
+ if (self->priv->primary && !mm_port_get_connected (MM_PORT (self->priv->primary))) {
+ g_assert (MM_IS_IFACE_PORT_AT (self->priv->primary));
+ g_assert (mm_iface_port_at_check_support (MM_IFACE_PORT_AT (self->priv->primary), &supported, NULL) && supported);
+ return MM_IFACE_PORT_AT (self->priv->primary);
+ }
/* If primary port is connected, check if we can get the secondary
* port */
- if (self->priv->secondary &&
- !mm_port_get_connected (MM_PORT (self->priv->secondary)))
- return self->priv->secondary;
+ if (self->priv->secondary && !mm_port_get_connected (MM_PORT (self->priv->secondary))) {
+ g_assert (MM_IS_IFACE_PORT_AT (self->priv->secondary));
+ g_assert (mm_iface_port_at_check_support (MM_IFACE_PORT_AT (self->priv->secondary), &supported, NULL) && supported);
+ return MM_IFACE_PORT_AT (self->priv->secondary);
+ }
/* Otherwise, we cannot get any port */
- g_set_error (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_CONNECTED,
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"No AT port available to run command");
return NULL;
}
diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h
index 1aea647f..fd06328c 100644
--- a/src/mm-base-modem.h
+++ b/src/mm-base-modem.h
@@ -35,6 +35,7 @@
#include "mm-port-serial-at.h"
#include "mm-port-serial-qcdm.h"
#include "mm-port-serial-gps.h"
+#include "mm-iface-port-at.h"
#if defined WITH_QMI
#include "mm-port-qmi.h"
@@ -166,7 +167,7 @@ MMPortSerialQcdm *mm_base_modem_peek_port_qcdm (MMBaseModem *self);
MMPortSerialAt *mm_base_modem_peek_port_gps_control (MMBaseModem *self);
MMPortSerialGps *mm_base_modem_peek_port_gps (MMBaseModem *self);
MMPortSerial *mm_base_modem_peek_port_audio (MMBaseModem *self);
-MMPortSerialAt *mm_base_modem_peek_best_at_port (MMBaseModem *self, GError **error);
+MMIfacePortAt *mm_base_modem_peek_best_at_port (MMBaseModem *self, GError **error);
MMPort *mm_base_modem_peek_best_data_port (MMBaseModem *self, MMPortType type);
GList *mm_base_modem_peek_data_ports (MMBaseModem *self);
@@ -176,7 +177,7 @@ MMPortSerialQcdm *mm_base_modem_get_port_qcdm (MMBaseModem *self);
MMPortSerialAt *mm_base_modem_get_port_gps_control (MMBaseModem *self);
MMPortSerialGps *mm_base_modem_get_port_gps (MMBaseModem *self);
MMPortSerial *mm_base_modem_get_port_audio (MMBaseModem *self);
-MMPortSerialAt *mm_base_modem_get_best_at_port (MMBaseModem *self, GError **error);
+MMIfacePortAt *mm_base_modem_get_best_at_port (MMBaseModem *self, GError **error);
MMPort *mm_base_modem_get_best_data_port (MMBaseModem *self, MMPortType type);
GList *mm_base_modem_get_data_ports (MMBaseModem *self);
diff --git a/src/mm-base-sms.c b/src/mm-base-sms.c
index fb83ea98..dfe6c06f 100644
--- a/src/mm-base-sms.c
+++ b/src/mm-base-sms.c
@@ -1030,7 +1030,7 @@ sms_store (MMBaseSms *self,
task = g_task_new (self, NULL, callback, user_data);
/* Select port for the operation */
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (self->priv->modem, &error));
+ port = mm_base_modem_peek_best_at_port (self->priv->modem, &error);
if (!port) {
g_task_return_error (task, error);
g_object_unref (task);
@@ -1333,7 +1333,7 @@ sms_send (MMBaseSms *self,
task = g_task_new (self, NULL, callback, user_data);
/* Select port for the operation */
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (self->priv->modem, &error));
+ port = mm_base_modem_peek_best_at_port (self->priv->modem, &error);
if (!port) {
g_task_return_error (task, error);
g_object_unref (task);
diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c
index d921cadc..f2f4127f 100644
--- a/src/mm-broadband-bearer.c
+++ b/src/mm-broadband-bearer.c
@@ -1707,7 +1707,7 @@ load_connection_status (MMBaseBearer *self,
}
/* If no control port available, error out */
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (modem, NULL));
+ port = mm_base_modem_peek_best_at_port (modem, NULL);
if (!port) {
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
"Couldn't load connection status: no control port available");
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 2258d0df..424290ff 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -2444,7 +2444,7 @@ modem_load_signal_quality (MMIfaceModem *_self,
g_task_set_task_data (task, ctx, (GDestroyNotify)signal_quality_context_free);
/* Check whether we can get a non-connected AT port */
- ctx->at_port = MM_IFACE_PORT_AT (mm_base_modem_get_best_at_port (MM_BASE_MODEM (self), &error));
+ ctx->at_port = mm_base_modem_get_best_at_port (MM_BASE_MODEM (self), &error);
if (ctx->at_port) {
if (!self->priv->modem_cind_disabled &&
self->priv->modem_cind_supported &&
@@ -5107,7 +5107,7 @@ modem_3gpp_register_in_network (MMIfaceModem3gpp *self,
task = g_task_new (self, cancellable, callback, user_data);
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), &error));
+ port = mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), &error);
if (!port) {
g_task_return_error (task, error);
g_object_unref (task);
diff --git a/src/plugins/sierra/mm-broadband-bearer-sierra.c b/src/plugins/sierra/mm-broadband-bearer-sierra.c
index 7fe559ae..4f0c9358 100644
--- a/src/plugins/sierra/mm-broadband-bearer-sierra.c
+++ b/src/plugins/sierra/mm-broadband-bearer-sierra.c
@@ -138,7 +138,7 @@ load_connection_status (MMBaseBearer *self,
g_task_set_task_data (task, GUINT_TO_POINTER ((guint)profile_id), NULL);
/* If no control port available, error out */
- port = MM_IFACE_PORT_AT (mm_base_modem_peek_best_at_port (modem, NULL));
+ port = mm_base_modem_peek_best_at_port (modem, NULL);
if (!port) {
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
"Couldn't load connection status: no control port available");