diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2024-04-04 14:27:04 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2024-04-23 07:25:12 +0000 |
commit | 939be0fbf856f2bcef30b7b32f4f2c2852fe2f7b (patch) | |
tree | 62b5ea47ef6a95ee8c3ecb698eeaa8a7fe429073 | |
parent | 480e12c34e574e6c282f76344eda05dbfaa66515 (diff) |
base-modem: support non-serial ports when peeking the best AT port
When we don't care about the type of AT port to use, prefer the QMI or
MBIM based ones if any available.
-rw-r--r-- | src/mm-base-call.c | 2 | ||||
-rw-r--r-- | src/mm-base-modem-at.c | 4 | ||||
-rw-r--r-- | src/mm-base-modem.c | 64 | ||||
-rw-r--r-- | src/mm-base-modem.h | 5 | ||||
-rw-r--r-- | src/mm-base-sms.c | 4 | ||||
-rw-r--r-- | src/mm-broadband-bearer.c | 2 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 4 | ||||
-rw-r--r-- | src/plugins/sierra/mm-broadband-bearer-sierra.c | 2 |
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"); |