diff --git a/modem/ofono/APKBUILD b/modem/ofono/APKBUILD
index 6a0e9dd1094651bfe320d696cb4f6927e4f459ef..7d0508666b25f7e30b8a8953d515e5b959c5242e 100644
--- a/modem/ofono/APKBUILD
+++ b/modem/ofono/APKBUILD
@@ -16,6 +16,7 @@ source="https://www.kernel.org/pub/linux/network/$pkgname/$pkgname-$pkgver.tar.x
 	fix-explicit-bzero.patch
 	fix-TEMP_FAILURE_RETRY.patch
 	skip-broken-test.patch
+	support-smdpkt.patch
 	0001-common-create-GList-helper-ofono_call_compare.patch
 	0002-common-atmodem-move-at_util_call_compare_by_status-t.patch
 	0003-common-atmodem-move-at_util_call_compare_by_id-to-dr.patch
@@ -50,10 +51,11 @@ sha512sums="14c3cd3a7ee134dd85f286e3ce47914a10c48a9a2bbbebd0d2715334f233a9b7e4e0
 7367464a8983969c9a78c1e4f8759a17eb47f6c61c94b088d749c83bb7ef5d19e037cadedd7ef5d34a0fdfe837fa8059e963f4fb2b14148e4a80f00e7cb29286  fix-explicit-bzero.patch
 687a2fd592add40122b789073ab9970d6e966752fdecc4077afe1c1bba705fe541dd0e457094f1d9cde747c571b7810b5b1a30835a3f1869bcd810751d5bf76f  fix-TEMP_FAILURE_RETRY.patch
 777ab2e13eebd1ccbe12a304310a83b262a5d934207c6a8d410e75aff380838eed1a52f3c2fe0d80c1e7db7faa9b55bf17e78a1e1acd8cfb95a3c6aef49c5b67  skip-broken-test.patch
+32e02e64cde806823b27c18380b88656a0fa95aefc35052256e368f13979d093fae5d7bbd6d1bb9ba8294912caea6e017715550872cabd85203a831658be4210  support-smdpkt.patch
 9af0061034f16ef4f9968ab05e2bdaa1e135f8b513eb5517654d8f924bd890a9e54f49e6ec4e7824a4001050bf6803f9fbf2ca815b36b1e1ea2889063a361296  0001-common-create-GList-helper-ofono_call_compare.patch
 aa3410eef1d6fe65dc9f6f68360031d02d3b32b7c363e13960813d2f0f16aee4e604e27f3d46bca569f6e17c82a74037812c25612a07ce1257b2d00e144f6d2f  0002-common-atmodem-move-at_util_call_compare_by_status-t.patch
 f906281888f06ec154ab9ca266d3641d32c6e295568aadbed7fb0cea42584c6aea4ea71d37530893bf184773772e6cd8b32559a6f4bc960dc5fadff23d747a56  0003-common-atmodem-move-at_util_call_compare_by_id-to-dr.patch
 6d7b350fed2b4be3b597fad19168448547e3730abfe8d398fc909cd43c1dfce2eabd6efec0bcb0aadb9cca7b8500e6a86b3d1455d9c6ade1a1deacd769e01c7a  0004-add-call-list-helper-to-manage-voice-call-lists.patch
 f5ab8f47e21545de71c866e3a7c589ba0f7d5c29f688df3fec06f01093bea72388f5e640a688b25288e58a107e85e5dd5c2c2616f57003ab148f28c2111fc88f  0005-qmimodem-implement-voice-calls.patch
-8bf14296d15458c930c99b97408fd6fb0d6d3cb9bffd5d85e7500514dc99fffe39a300da24ebc776811fe75e217a5537e358f72c3e8ac5070ec17f36bab086a9  ofono.initd
+a625f71a2b6fdcd7ac43cca64d2a532f5e5a0192b022fcf9157fad51801dc3b71c5d317a62f3f233136a6ed2bbf92e6f1c2fad2c6aa762b9719ceca02de025d1  ofono.initd
 8f2893dfc291fc210ef217c4bc74d79436a0997001dd2773809625d52dd19d092cc75d3f9aa5ed2f3d4a6248d4a4e17013a7655323f7dad951f744c55b572417  udev.rules"
diff --git a/modem/ofono/ofono.initd b/modem/ofono/ofono.initd
index ad555f63f5dcf15eb30d306d89c00f03653b40b0..051f627842b9aae9a95ea96508a7d559c0c153b7 100644
--- a/modem/ofono/ofono.initd
+++ b/modem/ofono/ofono.initd
@@ -9,7 +9,8 @@ depend() {
 
 start() {
    ebegin "Starting oFono"
-   start-stop-daemon --start --quiet --exec /usr/sbin/ofonod
+   # libsmdpkt_wrapper.so may not exist, if this device doesn't need it
+   start-stop-daemon --start --quiet --exec /usr/bin/env LD_PRELOAD=/usr/lib/preload/libsmdpkt_wrapper.so /usr/sbin/ofonod
    eend $?
 }
 
diff --git a/modem/ofono/support-smdpkt.patch b/modem/ofono/support-smdpkt.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f98733330bf9763dfe93ad0f25bba2c751c43615
--- /dev/null
+++ b/modem/ofono/support-smdpkt.patch
@@ -0,0 +1,100 @@
+From c11cbed28cbd7b927153069245e791dcb78a1e71 Mon Sep 17 00:00:00 2001
+From: Joey Hewitt <joey@joeyhewitt.com>
+Date: Fri, 19 Jul 2019 22:02:07 +0200
+Subject: [PATCH] support smdpkt
+
+---
+ plugins/udevng.c | 64 ++++++++++++++++++++++++++----------------------
+ 1 file changed, 35 insertions(+), 29 deletions(-)
+
+diff --git a/plugins/udevng.c b/plugins/udevng.c
+index f689b756..c07cae79 100644
+--- a/plugins/udevng.c
++++ b/plugins/udevng.c
+@@ -202,41 +202,45 @@ static gboolean setup_gobi(struct modem_info *modem)
+ 
+ 	DBG("%s", modem->syspath);
+ 
+-	for (list = modem->devices; list; list = list->next) {
+-		struct device_info *info = list->data;
++	if (modem->type != MODEM_TYPE_SERIAL) {
++		for (list = modem->devices; list; list = list->next) {
++			struct device_info *info = list->data;
+ 
+-		DBG("%s %s %s %s %s %s", info->devnode, info->interface,
+-						info->number, info->label,
+-						info->sysattr, info->subsystem);
++			DBG("%s %s %s %s %s %s", info->devnode, info->interface,
++							info->number, info->label,
++							info->sysattr, info->subsystem);
+ 
+-		if (g_strcmp0(info->subsystem, "usbmisc") == 0) /* cdc-wdm */
+-			qmi = info->devnode;
+-		else if (g_strcmp0(info->subsystem, "net") == 0) /* wwan */
+-			net = info->devnode;
+-		else if (g_strcmp0(info->subsystem, "tty") == 0) {
+-			if (g_strcmp0(info->interface, "255/255/255") == 0) {
+-				if (g_strcmp0(info->number, "00") == 0)
+-					diag = info->devnode; /* ec20 */
+-				else if (g_strcmp0(info->number, "01") == 0)
+-					diag = info->devnode; /* gobi */
+-				else if (g_strcmp0(info->number, "02") == 0)
+-					mdm = info->devnode; /* gobi */
+-				else if (g_strcmp0(info->number, "03") == 0)
+-					gps = info->devnode; /* gobi */
+-			} else if (g_strcmp0(info->interface, "255/0/0") == 0) {
+-				if (g_strcmp0(info->number, "01") == 0)
+-					gps = info->devnode; /* ec20 */
+-				if (g_strcmp0(info->number, "02") == 0)
+-					mdm = info->devnode; /* ec20 */
+-				/* ignore the 3rd device second AT/mdm iface */
++			if (g_strcmp0(info->subsystem, "usbmisc") == 0) /* cdc-wdm */
++				qmi = info->devnode;
++			else if (g_strcmp0(info->subsystem, "net") == 0) /* wwan */
++				net = info->devnode;
++			else if (g_strcmp0(info->subsystem, "tty") == 0) {
++				if (g_strcmp0(info->interface, "255/255/255") == 0) {
++					if (g_strcmp0(info->number, "00") == 0)
++						diag = info->devnode; /* ec20 */
++					else if (g_strcmp0(info->number, "01") == 0)
++						diag = info->devnode; /* gobi */
++					else if (g_strcmp0(info->number, "02") == 0)
++						mdm = info->devnode; /* gobi */
++					else if (g_strcmp0(info->number, "03") == 0)
++						gps = info->devnode; /* gobi */
++				} else if (g_strcmp0(info->interface, "255/0/0") == 0) {
++					if (g_strcmp0(info->number, "01") == 0)
++						gps = info->devnode; /* ec20 */
++					if (g_strcmp0(info->number, "02") == 0)
++						mdm = info->devnode; /* ec20 */
++					/* ignore the 3rd device second AT/mdm iface */
++				}
+ 			}
+ 		}
+-	}
+ 
+-	DBG("qmi=%s net=%s mdm=%s gps=%s diag=%s", qmi, net, mdm, gps, diag);
++		DBG("qmi=%s net=%s mdm=%s gps=%s diag=%s", qmi, net, mdm, gps, diag);
+ 
+-	if (qmi == NULL || mdm == NULL || net == NULL)
+-		return FALSE;
++		if (qmi == NULL || mdm == NULL || net == NULL)
++			return FALSE;
++	} else {
++		qmi = modem->serial->devnode;
++	}
+ 
+ 
+ 	ofono_modem_set_string(modem->modem, "Device", qmi);
+@@ -1867,6 +1871,8 @@ static void enumerate_devices(struct udev *context)
+ 		return;
+ 
+ 	udev_enumerate_add_match_subsystem(enumerate, "tty");
++	udev_enumerate_add_match_subsystem(enumerate, "smdpkt");
++	udev_enumerate_add_match_subsystem(enumerate, "rpmsg");
+ 	udev_enumerate_add_match_subsystem(enumerate, "usb");
+ 	udev_enumerate_add_match_subsystem(enumerate, "usbmisc");
+ 	udev_enumerate_add_match_subsystem(enumerate, "net");
+-- 
+2.22.0
+