diff options
author | QC8086 <QC8086@QC8086.com> | 2023-06-06 17:11:35 +0000 |
---|---|---|
committer | psykose <alice@ayaya.dev> | 2023-06-06 19:11:56 +0200 |
commit | f72fd14f68d626c190282e4fb63ba484460b4b14 (patch) | |
tree | f86577e256987b9fb8a1607c8ce321dd8bd242d5 | |
parent | 0e6a5741dc3b9f632cc38c1d104d529280d988f1 (diff) |
community/modemmanager: backport modemmanager patch
This patch is necessary for enabling --test-quick-suspend-resume on the
Librem 5 in postmarketOS.
-rw-r--r-- | community/modemmanager/APKBUILD | 4 | ||||
-rw-r--r-- | community/modemmanager/broadband-modem-qmi-enable-disable-messaging-AT-unso.patch | 222 |
2 files changed, 225 insertions, 1 deletions
diff --git a/community/modemmanager/APKBUILD b/community/modemmanager/APKBUILD index 3353aad1cc9..714eab589dd 100644 --- a/community/modemmanager/APKBUILD +++ b/community/modemmanager/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Stuart Cardall <developer@it-offshore.co.uk> pkgname=modemmanager pkgver=1.20.6 -pkgrel=1 +pkgrel=2 pkgdesc="ModemManager library" url="https://www.freedesktop.org/wiki/Software/ModemManager" arch="all" @@ -36,6 +36,7 @@ subpackages=" source="https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/archive/$pkgver/ModemManager-$pkgver.tar.gz $pkgname.rules $pkgname.initd + broadband-modem-qmi-enable-disable-messaging-AT-unso.patch " builddir="$srcdir"/ModemManager-$pkgver @@ -85,4 +86,5 @@ sha512sums=" 4fb197d37c76d93f611d7ef679304f678a43406339ce8de1f6eacd24dba5408aa0a6e4e99c01ed2583920603a71cd4aaf54f6e2274a5f2d0d41b5a5ce7021078 ModemManager-1.20.6.tar.gz 6fab86c27502b29be0c6610d835a3249a4a81993eb986cff2c3ea9393fadd3f693ba4bb0532ae0e50a83d359559511859dd05f7ea2f0cb52839f535a7e49f8a0 modemmanager.rules 9f74a2473b9cc7be42a467809639f5720ab251d13f29f8bbd4fd9a13edb80c10c5ee50fbe50819bfe67f231805b92f007c3e7403c46ab998dc843e1f9549659b modemmanager.initd +339f4138a19063e77545cf722aeebf12a46255a68a07b322b59754573f3b09af2093e797c6762b24ebad696a0aec1d769046d9a738b28f8f9a27b2edd8e89d29 broadband-modem-qmi-enable-disable-messaging-AT-unso.patch " diff --git a/community/modemmanager/broadband-modem-qmi-enable-disable-messaging-AT-unso.patch b/community/modemmanager/broadband-modem-qmi-enable-disable-messaging-AT-unso.patch new file mode 100644 index 00000000000..477ce49d786 --- /dev/null +++ b/community/modemmanager/broadband-modem-qmi-enable-disable-messaging-AT-unso.patch @@ -0,0 +1,222 @@ +Patch-Source: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/commit/9007d7999dcc96237ebef19413112b09db777876 +-- +From: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm> +Date: Tue, 11 Apr 2023 01:09:31 +0200 +Subject: broadband-modem-qmi: enable/disable messaging AT unsolicited events + too + +When the host is resuming from system suspend, QMI indications +sent by the modem at resume time can be lost. The exact reason why it +happens is still unknown. Until this is fixed, ModemManager currently +workarounds that in QMI mode by listening and reacting to AT URCs too, +which are being received reliably. In order to achieve that, +messaging_setup_unsolicited_events chains the parent's implementation +with its own, effectively setting up handlers for both AT and QMI +channels. + +This worked fine on modems such as EG25 which enable SMS indications +by default. However, some modems, such as BM818, don't have these +indications enabled on boot and don't report incoming messages via AT +unless requested via AT+CNMI. + +To make SMS handling on resume reliable on such modems, make sure +that MMBroadbandModemQmi also enables/disables unsolicited events +in the same way it already sets up handlers for them. + +Signed-off-by: Sebastian Krzyszkowiak <dos@dosowisko.net> +--- + src/mm-broadband-modem-qmi.c | 130 +++++++++++++++++++++++++++++-------------- + 1 file changed, 88 insertions(+), 42 deletions(-) + +diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c +index 817ff7f..5f79d27 100644 +--- a/src/mm-broadband-modem-qmi.c ++++ b/src/mm-broadband-modem-qmi.c +@@ -7231,13 +7231,6 @@ messaging_disable_unsolicited_events_finish (MMIfaceModemMessaging *_self, + GAsyncResult *res, + GError **error) + { +- MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); +- +- /* Handle AT URC only fallback */ +- if (self->priv->messaging_fallback_at_only && iface_modem_messaging_parent->disable_unsolicited_events_finish) { +- return iface_modem_messaging_parent->disable_unsolicited_events_finish (_self, res, error); +- } +- + return g_task_propagate_boolean (G_TASK (res), error); + } + +@@ -7246,13 +7239,6 @@ messaging_enable_unsolicited_events_finish (MMIfaceModemMessaging *_self, + GAsyncResult *res, + GError **error) + { +- MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); +- +- /* Handle AT URC only fallback */ +- if (self->priv->messaging_fallback_at_only) { +- return iface_modem_messaging_parent->enable_unsolicited_events_finish (_self, res, error); +- } +- + return g_task_propagate_boolean (G_TASK (res), error); + } + +@@ -7290,20 +7276,20 @@ ser_messaging_indicator_ready (QmiClientWms *client, + static void + common_enable_disable_messaging_unsolicited_events (MMBroadbandModemQmi *self, + gboolean enable, +- GAsyncReadyCallback callback, +- gpointer user_data) ++ GTask *task) + { + EnableMessagingUnsolicitedEventsContext *ctx; +- GTask *task; + QmiClient *client = NULL; + QmiMessageWmsSetEventReportInput *input; ++ GError *error = NULL; + +- if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), +- QMI_SERVICE_WMS, &client, +- callback, user_data)) ++ client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), ++ QMI_SERVICE_WMS, MM_PORT_QMI_FLAG_DEFAULT, &error); ++ if (!client) { ++ g_task_return_error (task, error); ++ g_object_unref (task); + return; +- +- task = g_task_new (self, NULL, callback, user_data); ++ } + + if (enable == self->priv->messaging_unsolicited_events_enabled) { + mm_obj_dbg (self, "messaging unsolicited events already %s; skipping", +@@ -7334,33 +7320,94 @@ common_enable_disable_messaging_unsolicited_events (MMBroadbandModemQmi *self, + qmi_message_wms_set_event_report_input_unref (input); + } + ++static void ++parent_messaging_disable_unsolicited_events_ready (MMIfaceModemMessaging *_self, ++ GAsyncResult *res, ++ GTask *task) ++{ ++ MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); ++ GError *error = NULL; ++ ++ if (!iface_modem_messaging_parent->disable_unsolicited_events_finish (_self, res, &error)) { ++ if (self->priv->messaging_fallback_at_only) { ++ g_task_return_error (task, error); ++ g_object_unref (task); ++ return; ++ } ++ mm_obj_dbg (self, "disabling parent messaging unsolicited events failed: %s", error->message); ++ g_clear_error (&error); ++ } ++ ++ /* handle AT URC only fallback */ ++ if (self->priv->messaging_fallback_at_only) { ++ g_task_return_boolean (task, TRUE); ++ g_object_unref (task); ++ return; ++ } ++ ++ /* Disable QMI indications */ ++ common_enable_disable_messaging_unsolicited_events (self, FALSE, task); ++} ++ + static void + messaging_disable_unsolicited_events (MMIfaceModemMessaging *_self, + GAsyncReadyCallback callback, + gpointer user_data) + { + MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); ++ GTask *task; + +- /* Handle AT URC only fallback */ ++ task = g_task_new (self, NULL, callback, user_data); ++ ++ /* Generic implementation doesn't actually have a method to disable ++ * unsolicited messaging events */ ++ if (iface_modem_messaging_parent->disable_unsolicited_events) { ++ /* Disable AT URCs parent and chain QMI indication disabling */ ++ iface_modem_messaging_parent->disable_unsolicited_events ( ++ _self, ++ (GAsyncReadyCallback)parent_messaging_disable_unsolicited_events_ready, ++ task); ++ return; ++ } ++ ++ /* handle AT URC only fallback */ + if (self->priv->messaging_fallback_at_only) { +- /* Generic implementation doesn't actually have a method to disable +- * unsolicited messaging events */ +- if (!iface_modem_messaging_parent->disable_unsolicited_events) { +- GTask *task; ++ g_task_return_boolean (task, TRUE); ++ g_object_unref (task); ++ return; ++ } + +- task = g_task_new (self, NULL, callback, user_data); +- g_task_return_boolean (task, TRUE); ++ /* Disable QMI indications */ ++ common_enable_disable_messaging_unsolicited_events (self, FALSE, task); ++} ++ ++static void ++parent_messaging_enable_unsolicited_events_ready (MMIfaceModemMessaging *_self, ++ GAsyncResult *res, ++ GTask *task) ++{ ++ MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); ++ GError *error = NULL; ++ ++ if (!iface_modem_messaging_parent->enable_unsolicited_events_finish (_self, res, &error)) { ++ if (self->priv->messaging_fallback_at_only) { ++ g_task_return_error (task, error); + g_object_unref (task); + return; + } ++ mm_obj_dbg (self, "enabling parent messaging unsolicited events failed: %s", error->message); ++ g_clear_error (&error); ++ } + +- return iface_modem_messaging_parent->disable_unsolicited_events (_self, callback, user_data); ++ /* handle AT URC only fallback */ ++ if (self->priv->messaging_fallback_at_only) { ++ g_task_return_boolean (task, TRUE); ++ g_object_unref (task); ++ return; + } + +- common_enable_disable_messaging_unsolicited_events (MM_BROADBAND_MODEM_QMI (self), +- FALSE, +- callback, +- user_data); ++ /* Enable QMI indications */ ++ common_enable_disable_messaging_unsolicited_events (self, TRUE, task); + } + + static void +@@ -7369,16 +7416,15 @@ messaging_enable_unsolicited_events (MMIfaceModemMessaging *_self, + gpointer user_data) + { + MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self); ++ GTask *task; + +- /* Handle AT URC only fallback */ +- if (self->priv->messaging_fallback_at_only) { +- return iface_modem_messaging_parent->enable_unsolicited_events (_self, callback, user_data); +- } ++ task = g_task_new (self, NULL, callback, user_data); + +- common_enable_disable_messaging_unsolicited_events (MM_BROADBAND_MODEM_QMI (self), +- TRUE, +- callback, +- user_data); ++ /* Enable AT URCs parent and chain QMI indication enabling */ ++ iface_modem_messaging_parent->enable_unsolicited_events ( ++ _self, ++ (GAsyncReadyCallback)parent_messaging_enable_unsolicited_events_ready, ++ task); + } + + /*****************************************************************************/ |