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 /src | |
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.
Diffstat (limited to 'src')
-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"); |