diff options
author | Torsten Hilbrich <torsten.hilbrich@secunet.com> | 2020-12-02 12:46:32 +0100 |
---|---|---|
committer | Torsten Hilbrich <torsten.hilbrich@secunet.com> | 2020-12-03 08:00:30 +0100 |
commit | 8072ed2d6f4240ceb7b66f5e618192fd54ea94b2 (patch) | |
tree | e95e341c1915c051a8134776312d352c50494eaf | |
parent | f80c8d8be6a22accb71f06b33f53daed3d255bec (diff) |
broadband-modem-mbim: Add MM_BROADBAND_MODEM_MBIM_QMI_UNSUPPORTED
This property (initially set to FALSE) controls whether QMI over MBIM
should never be considered. This property is set to TRUE for XMM-based
MBIM devices as they don't support QMI.
This fixes a probing delay of 15s on a Fibocom L850-GL device
(2cb7:0007) found in the Lenovo T14 Gen 1.
The establishing of a QMI connection was refused multiple time with
MBIM error OperationNotAllowed. Only the timeout of 15s for this
connection resumed the probing.
The properties in the MMBroadbandModemMbim are only installed when
WITH_QMI and QMI_MBIM_QMUX_SUPPORTED are set. Actually, this should only
disable the PROP_QMI_UNSUPPORTED but as this is the only property this
avoids the "unused variable 'self'" warnings/errors when trying to
compile set_property and get_property without QMI support. This can be
changed once other properties are needed.
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/284
-rw-r--r-- | plugins/xmm/mm-broadband-modem-mbim-xmm.c | 3 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 71 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.h | 2 |
3 files changed, 75 insertions, 1 deletions
diff --git a/plugins/xmm/mm-broadband-modem-mbim-xmm.c b/plugins/xmm/mm-broadband-modem-mbim-xmm.c index 781d7e4f..4a6cd93d 100644 --- a/plugins/xmm/mm-broadband-modem-mbim-xmm.c +++ b/plugins/xmm/mm-broadband-modem-mbim-xmm.c @@ -56,6 +56,9 @@ mm_broadband_modem_mbim_xmm_new (const gchar *device, MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, TRUE, MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED, FALSE, MM_IFACE_MODEM_PERIODIC_SIGNAL_CHECK_DISABLED, TRUE, +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + MM_BROADBAND_MODEM_MBIM_QMI_UNSUPPORTED, TRUE, +#endif NULL); } diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index f18189b0..19f9dc78 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -86,6 +86,14 @@ typedef enum { PROCESS_NOTIFICATION_FLAG_LTE_ATTACH_STATUS = 1 << 8, } ProcessNotificationFlag; +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED +enum { + PROP_0, + PROP_QMI_UNSUPPORTED, + PROP_LAST +}; +#endif + struct _MMBroadbandModemMbimPrivate { /* Queried and cached capabilities */ MbimCellularClass caps_cellular_class; @@ -128,6 +136,7 @@ struct _MMBroadbandModemMbimPrivate { gulong mbim_device_removed_id; #if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + gboolean qmi_unsupported; /* Flag when QMI-based capability/mode switching is in use */ gboolean qmi_capability_and_mode_switching; #endif @@ -2429,6 +2438,9 @@ initialization_started (MMBroadbandModem *self, { InitializationStartedContext *ctx; GTask *task; +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + gboolean qmi_unsupported = FALSE; +#endif ctx = g_slice_new0 (InitializationStartedContext); ctx->mbim = mm_broadband_modem_mbim_get_port_mbim (MM_BROADBAND_MODEM_MBIM (self)); @@ -2454,10 +2466,16 @@ initialization_started (MMBroadbandModem *self, return; } +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + g_object_get (self, + MM_BROADBAND_MODEM_MBIM_QMI_UNSUPPORTED, &qmi_unsupported, + NULL); +#endif + /* Now open our MBIM port */ mm_port_mbim_open (ctx->mbim, #if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED - TRUE, /* With QMI over MBIM support if available */ + ! qmi_unsupported, /* With QMI over MBIM support if available */ #endif NULL, (GAsyncReadyCallback)mbim_port_open_ready, @@ -5506,6 +5524,44 @@ messaging_create_sms (MMIfaceModemMessaging *self) /*****************************************************************************/ +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED +static void +set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (object); + + switch (prop_id) { + case PROP_QMI_UNSUPPORTED: + self->priv->qmi_unsupported = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (object); + + switch (prop_id) { + case PROP_QMI_UNSUPPORTED: + g_value_set_boolean (value, self->priv->qmi_unsupported); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} +#endif + MMBroadbandModemMbim * mm_broadband_modem_mbim_new (const gchar *device, const gchar **drivers, @@ -5835,6 +5891,10 @@ mm_broadband_modem_mbim_class_init (MMBroadbandModemMbimClass *klass) klass->peek_port_mbim_for_data = peek_port_mbim_for_data; +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + object_class->set_property = set_property; + object_class->get_property = get_property; +#endif object_class->dispose = dispose; object_class->finalize = finalize; @@ -5845,4 +5905,13 @@ mm_broadband_modem_mbim_class_init (MMBroadbandModemMbimClass *klass) /* Do not initialize the MBIM modem through AT commands */ broadband_modem_class->enabling_modem_init = NULL; broadband_modem_class->enabling_modem_init_finish = NULL; + +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + g_object_class_install_property (object_class, PROP_QMI_UNSUPPORTED, + g_param_spec_boolean (MM_BROADBAND_MODEM_MBIM_QMI_UNSUPPORTED, + "QMI over MBIM unsupported", + "TRUE when QMI over MBIM should not be considered.", + FALSE, + G_PARAM_READWRITE)); +#endif } diff --git a/src/mm-broadband-modem-mbim.h b/src/mm-broadband-modem-mbim.h index 2d241fed..66a12f2a 100644 --- a/src/mm-broadband-modem-mbim.h +++ b/src/mm-broadband-modem-mbim.h @@ -29,6 +29,8 @@ typedef struct _MMBroadbandModemMbim MMBroadbandModemMbim; typedef struct _MMBroadbandModemMbimClass MMBroadbandModemMbimClass; typedef struct _MMBroadbandModemMbimPrivate MMBroadbandModemMbimPrivate; +#define MM_BROADBAND_MODEM_MBIM_QMI_UNSUPPORTED "broadband-modem-mbim-qmi-unsupported" + struct _MMBroadbandModemMbim { MMBroadbandModem parent; MMBroadbandModemMbimPrivate *priv; |