diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2020-10-22 12:07:09 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-11-09 18:41:57 +0100 |
commit | b8f6fb59ed3f9c314c6b13b0830c0930c718902d (patch) | |
tree | b7893b9065628600ca9ed08ad62eca7951e14df6 | |
parent | 0dbb8d03f59d0db8cf6be63020b78289c3168154 (diff) |
broadband-modem-qmi: peeking QMI port only in QMI modems
Move the logic out of the base modem, and make it applicable only for
QMI modems.
-rw-r--r-- | src/mm-base-modem.c | 79 | ||||
-rw-r--r-- | src/mm-base-modem.h | 8 | ||||
-rw-r--r-- | src/mm-bearer-qmi.c | 2 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 109 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.h | 17 | ||||
-rw-r--r-- | src/mm-iface-modem-firmware.c | 6 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 6 | ||||
-rw-r--r-- | src/mm-sim-qmi.c | 3 | ||||
-rw-r--r-- | src/mm-sms-qmi.c | 3 |
9 files changed, 133 insertions, 100 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 9343ccba..93221dae 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -681,85 +681,6 @@ mm_base_modem_peek_port_audio (MMBaseModem *self) return self->priv->audio; } -#if defined WITH_QMI - -MMPortQmi * -mm_base_modem_get_port_qmi (MMBaseModem *self) -{ - g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL); - - /* First QMI port in the list is the primary one always */ - return (self->priv->qmi ? ((MMPortQmi *)g_object_ref (self->priv->qmi->data)) : NULL); -} - -MMPortQmi * -mm_base_modem_peek_port_qmi (MMBaseModem *self) -{ - g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL); - - /* First QMI port in the list is the primary one always */ - return (self->priv->qmi ? (MMPortQmi *)self->priv->qmi->data : NULL); -} - -MMPortQmi * -mm_base_modem_get_port_qmi_for_data (MMBaseModem *self, - MMPort *data, - GError **error) -{ - MMPortQmi *qmi; - - qmi = mm_base_modem_peek_port_qmi_for_data (self, data, error); - return (qmi ? (MMPortQmi *)g_object_ref (qmi) : NULL); -} - -MMPortQmi * -mm_base_modem_peek_port_qmi_for_data (MMBaseModem *self, - MMPort *data, - GError **error) -{ - GList *cdc_wdm_qmi_ports, *l; - const gchar *net_port_parent_path; - MMPortQmi *found = NULL; - - g_warn_if_fail (mm_port_get_subsys (data) == MM_PORT_SUBSYS_NET); - net_port_parent_path = mm_kernel_device_get_interface_sysfs_path (mm_port_peek_kernel_device (data)); - if (!net_port_parent_path) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "No parent path for 'net/%s'", - mm_port_get_device (data)); - return NULL; - } - - /* Find the CDC-WDM port on the same USB interface as the given net port */ - cdc_wdm_qmi_ports = mm_base_modem_find_ports (MM_BASE_MODEM (self), - MM_PORT_SUBSYS_USB, - MM_PORT_TYPE_QMI, - NULL); - for (l = cdc_wdm_qmi_ports; l && !found; l = g_list_next (l)) { - const gchar *wdm_port_parent_path; - - g_assert (MM_IS_PORT_QMI (l->data)); - wdm_port_parent_path = mm_kernel_device_get_interface_sysfs_path (mm_port_peek_kernel_device (MM_PORT (l->data))); - if (wdm_port_parent_path && g_str_equal (wdm_port_parent_path, net_port_parent_path)) - found = MM_PORT_QMI (l->data); - } - - g_list_free_full (cdc_wdm_qmi_ports, g_object_unref); - - if (!found) - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_NOT_FOUND, - "Couldn't find associated QMI port for 'net/%s'", - mm_port_get_device (data)); - - return found; -} - -#endif /* WITH_QMI */ - MMPort * mm_base_modem_get_best_data_port (MMBaseModem *self, MMPortType type) diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index d96446e8..7b00b568 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -125,10 +125,6 @@ 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); -#if defined WITH_QMI -MMPortQmi *mm_base_modem_peek_port_qmi (MMBaseModem *self); -MMPortQmi *mm_base_modem_peek_port_qmi_for_data (MMBaseModem *self, MMPort *data, GError **error); -#endif MMPortSerialAt *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); @@ -139,10 +135,6 @@ 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); -#if defined WITH_QMI -MMPortQmi *mm_base_modem_get_port_qmi (MMBaseModem *self); -MMPortQmi *mm_base_modem_get_port_qmi_for_data (MMBaseModem *self, MMPort *data, GError **error); -#endif MMPortSerialAt *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-bearer-qmi.c b/src/mm-bearer-qmi.c index b00df788..b3ea0d84 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -1642,7 +1642,7 @@ _connect (MMBaseBearer *_self, } /* Each data port has a single QMI port associated */ - qmi = mm_base_modem_get_port_qmi_for_data (modem, data, &error); + qmi = mm_broadband_modem_qmi_get_port_qmi_for_data (MM_BROADBAND_MODEM_QMI (modem), data, &error); if (!qmi) { g_task_report_error ( self, diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 2bff104c..fe245dd9 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -153,7 +153,7 @@ shared_qmi_peek_client (MMSharedQmi *self, MMPortQmi *port; QmiClient *client; - port = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); + port = mm_broadband_modem_qmi_peek_port_qmi (MM_BROADBAND_MODEM_QMI (self)); if (!port) { g_set_error (error, MM_CORE_ERROR, @@ -174,6 +174,107 @@ shared_qmi_peek_client (MMSharedQmi *self, } /*****************************************************************************/ + +MMPortQmi * +mm_broadband_modem_qmi_get_port_qmi (MMBroadbandModemQmi *self) +{ + MMPortQmi *primary_qmi_port; + + g_assert (MM_IS_BROADBAND_MODEM_QMI (self)); + + primary_qmi_port = mm_broadband_modem_qmi_peek_port_qmi (self); + return (primary_qmi_port ? + MM_PORT_QMI (g_object_ref (primary_qmi_port)) : + NULL); +} + +MMPortQmi * +mm_broadband_modem_qmi_peek_port_qmi (MMBroadbandModemQmi *self) +{ + MMPortQmi *primary_qmi_port = NULL; + GList *qmi_ports; + + g_assert (MM_IS_BROADBAND_MODEM_QMI (self)); + + qmi_ports = mm_base_modem_find_ports (MM_BASE_MODEM (self), + MM_PORT_SUBSYS_USB, + MM_PORT_TYPE_QMI, + NULL); + + /* First QMI port in the list is the primary one always */ + if (qmi_ports) + primary_qmi_port = MM_PORT_QMI (qmi_ports->data); + + g_list_free_full (qmi_ports, g_object_unref); + + return primary_qmi_port; +} + +MMPortQmi * +mm_broadband_modem_qmi_get_port_qmi_for_data (MMBroadbandModemQmi *self, + MMPort *data, + GError **error) +{ + MMPortQmi *qmi_port; + + g_assert (MM_IS_BROADBAND_MODEM_QMI (self)); + + qmi_port = mm_broadband_modem_qmi_peek_port_qmi_for_data (self, data, error); + return (qmi_port ? + MM_PORT_QMI (g_object_ref (qmi_port)) : + NULL); +} + +MMPortQmi * +mm_broadband_modem_qmi_peek_port_qmi_for_data (MMBroadbandModemQmi *self, + MMPort *data, + GError **error) +{ + GList *cdc_wdm_qmi_ports; + GList *l; + const gchar *net_port_parent_path; + MMPortQmi *found = NULL; + + g_assert (MM_IS_BROADBAND_MODEM_QMI (self)); + g_assert (mm_port_get_subsys (data) == MM_PORT_SUBSYS_NET); + + net_port_parent_path = mm_kernel_device_get_interface_sysfs_path (mm_port_peek_kernel_device (data)); + if (!net_port_parent_path) { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "No parent path for 'net/%s'", + mm_port_get_device (data)); + return NULL; + } + + /* Find the CDC-WDM port on the same USB interface as the given net port */ + cdc_wdm_qmi_ports = mm_base_modem_find_ports (MM_BASE_MODEM (self), + MM_PORT_SUBSYS_USB, + MM_PORT_TYPE_QMI, + NULL); + for (l = cdc_wdm_qmi_ports; l && !found; l = g_list_next (l)) { + const gchar *wdm_port_parent_path; + + g_assert (MM_IS_PORT_QMI (l->data)); + wdm_port_parent_path = mm_kernel_device_get_interface_sysfs_path (mm_port_peek_kernel_device (MM_PORT (l->data))); + if (wdm_port_parent_path && g_str_equal (wdm_port_parent_path, net_port_parent_path)) + found = MM_PORT_QMI (l->data); + } + + g_list_free_full (cdc_wdm_qmi_ports, g_object_unref); + + if (!found) + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_NOT_FOUND, + "Couldn't find associated QMI port for 'net/%s'", + mm_port_get_device (data)); + + return found; +} + +/*****************************************************************************/ /* Create Bearer (Modem interface) */ static MMBaseBearer * @@ -8946,7 +9047,7 @@ parent_enabling_started_ready (MMBroadbandModem *_self, g_task_set_task_data (task, ctx, (GDestroyNotify)enabling_started_context_free); /* Keep a full port reference around */ - ctx->qmi = mm_base_modem_get_port_qmi (MM_BASE_MODEM (self)); + ctx->qmi = mm_broadband_modem_qmi_get_port_qmi (MM_BROADBAND_MODEM_QMI (self)); if (!ctx->qmi) { mm_obj_warn (self, "cannot check whether autoconnect is disabled or not: couldn't peek QMI port"); /* not fatal, just assume autoconnect is disabled */ @@ -9220,7 +9321,7 @@ initialization_started (MMBroadbandModem *self, GError *error = NULL; ctx = g_new0 (InitializationStartedContext, 1); - ctx->qmi = mm_base_modem_get_port_qmi (MM_BASE_MODEM (self)); + ctx->qmi = mm_broadband_modem_qmi_get_port_qmi (MM_BROADBAND_MODEM_QMI (self)); task = g_task_new (self, NULL, callback, user_data); g_task_set_task_data (task, ctx, (GDestroyNotify)initialization_started_context_free); @@ -9308,7 +9409,7 @@ dispose (GObject *object) /* If any port cleanup is needed, it must be done during dispose(), as * the modem object will be affected by an explicit g_object_run_dispose() * that will remove all port references right away */ - qmi = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); + qmi = mm_broadband_modem_qmi_peek_port_qmi (self); if (qmi) { /* Disconnect signal handler for qmi-proxy disappearing, if it exists */ untrack_qmi_device_removed (self, qmi); diff --git a/src/mm-broadband-modem-qmi.h b/src/mm-broadband-modem-qmi.h index 23825068..116d2fea 100644 --- a/src/mm-broadband-modem-qmi.h +++ b/src/mm-broadband-modem-qmi.h @@ -41,10 +41,19 @@ struct _MMBroadbandModemQmiClass{ GType mm_broadband_modem_qmi_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBroadbandModemQmi, g_object_unref) -MMBroadbandModemQmi *mm_broadband_modem_qmi_new (const gchar *device, +MMBroadbandModemQmi *mm_broadband_modem_qmi_new (const gchar *device, const gchar **drivers, - const gchar *plugin, - guint16 vendor_id, - guint16 product_id); + const gchar *plugin, + guint16 vendor_id, + guint16 product_id); + +MMPortQmi *mm_broadband_modem_qmi_peek_port_qmi (MMBroadbandModemQmi *self); +MMPortQmi *mm_broadband_modem_qmi_peek_port_qmi_for_data (MMBroadbandModemQmi *self, + MMPort *data, + GError **error); +MMPortQmi *mm_broadband_modem_qmi_get_port_qmi (MMBroadbandModemQmi *self); +MMPortQmi *mm_broadband_modem_qmi_get_port_qmi_for_data (MMBroadbandModemQmi *self, + MMPort *data, + GError **error); #endif /* MM_BROADBAND_MODEM_QMI_H */ diff --git a/src/mm-iface-modem-firmware.c b/src/mm-iface-modem-firmware.c index 866960e9..35557bd7 100644 --- a/src/mm-iface-modem-firmware.c +++ b/src/mm-iface-modem-firmware.c @@ -21,6 +21,9 @@ #include "mm-iface-modem-firmware.h" #include "mm-log-object.h" +#if defined WITH_QMI +# include "mm-broadband-modem-qmi.h" +#endif #if defined WITH_MBIM # include "mm-broadband-modem-mbim.h" #endif @@ -335,7 +338,8 @@ add_generic_device_ids (MMBaseModem *self, pid = mm_base_modem_get_product_id (self); #if defined WITH_QMI - primary = MM_PORT (mm_base_modem_peek_port_qmi (self)); + if (MM_IS_BROADBAND_MODEM_QMI (self)) + primary = MM_PORT (mm_broadband_modem_qmi_peek_port_qmi (MM_BROADBAND_MODEM_QMI (self))); #endif #if defined WITH_MBIM if (!primary && MM_IS_BROADBAND_MODEM_MBIM (self)) diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index eefc7efd..0ddc0a29 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -28,6 +28,9 @@ #include "mm-private-boxed-types.h" #include "mm-log-object.h" #include "mm-context.h" +#if defined WITH_QMI +# include "mm-broadband-modem-qmi.h" +#endif #if defined WITH_MBIM # include "mm-broadband-modem-mbim.h" #endif @@ -4959,7 +4962,8 @@ interface_initialization_step (GTask *task) MMPort *primary = NULL; #if defined WITH_QMI - primary = MM_PORT (mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self))); + if (MM_IS_BROADBAND_MODEM_QMI (self)) + primary = MM_PORT (mm_broadband_modem_qmi_peek_port_qmi (MM_BROADBAND_MODEM_QMI (self))); #endif #if defined WITH_MBIM if (!primary && MM_IS_BROADBAND_MODEM_MBIM (self)) diff --git a/src/mm-sim-qmi.c b/src/mm-sim-qmi.c index d8ef4c70..4d8ad043 100644 --- a/src/mm-sim-qmi.c +++ b/src/mm-sim-qmi.c @@ -25,6 +25,7 @@ #define _LIBMM_INSIDE_MM #include <libmm-glib.h> +#include "mm-broadband-modem-qmi.h" #include "mm-log-object.h" #include "mm-sim-qmi.h" #include "mm-modem-helpers-qmi.h" @@ -60,7 +61,7 @@ ensure_qmi_client (GTask *task, NULL); g_assert (MM_IS_BASE_MODEM (modem)); - port = mm_base_modem_peek_port_qmi (modem); + port = mm_broadband_modem_qmi_peek_port_qmi (MM_BROADBAND_MODEM_QMI (modem)); g_object_unref (modem); if (!port) { diff --git a/src/mm-sms-qmi.c b/src/mm-sms-qmi.c index 6f3fe0d2..81c6f476 100644 --- a/src/mm-sms-qmi.c +++ b/src/mm-sms-qmi.c @@ -24,6 +24,7 @@ #define _LIBMM_INSIDE_MM #include <libmm-glib.h> +#include "mm-broadband-modem-qmi.h" #include "mm-modem-helpers-qmi.h" #include "mm-iface-modem.h" #include "mm-iface-modem-messaging.h" @@ -53,7 +54,7 @@ ensure_qmi_client (MMSmsQmi *self, NULL); g_assert (MM_IS_BASE_MODEM (modem)); - port = mm_base_modem_peek_port_qmi (modem); + port = mm_broadband_modem_qmi_peek_port_qmi (MM_BROADBAND_MODEM_QMI (modem)); g_object_unref (modem); if (!port) { |