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.
This commit is contained in:
Aleksander Morgado
2020-10-22 12:07:09 +02:00
parent 0dbb8d03f5
commit b8f6fb59ed
9 changed files with 133 additions and 100 deletions

View File

@@ -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)

View File

@@ -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);

View File

@@ -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,

View File

@@ -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,
@@ -173,6 +173,107 @@ shared_qmi_peek_client (MMSharedQmi *self,
return client;
}
/*****************************************************************************/
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) */
@@ -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);

View File

@@ -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 */

View File

@@ -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))

View File

@@ -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))

View File

@@ -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) {

View File

@@ -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) {