aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQC8086 <QC8086@QC8086.com>2023-06-06 17:11:35 +0000
committerpsykose <alice@ayaya.dev>2023-06-06 19:11:56 +0200
commitf72fd14f68d626c190282e4fb63ba484460b4b14 (patch)
treef86577e256987b9fb8a1607c8ce321dd8bd242d5
parent0e6a5741dc3b9f632cc38c1d104d529280d988f1 (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/APKBUILD4
-rw-r--r--community/modemmanager/broadband-modem-qmi-enable-disable-messaging-AT-unso.patch222
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);
+ }
+
+ /*****************************************************************************/