[PATCH 02/11] net: wwan: t9xx: Add control plane transaction layer

Jagielski, Jedrzej jedrzej.jagielski at intel.com
Mon Jun 1 04:24:17 PDT 2026


From: Jack Wu via B4 Relay <devnull+jackbb_wu.compal.com at kernel.org> 
Sent: Friday, May 29, 2026 12:32 PM

>From: Jack Wu <jackbb_wu at compal.com>
>
>The control plane implements TX services that reside in the
>transaction layer. The services receive the packets from the
>port layer and call the corresponding DMA components to
>transmit data to the device. Meanwhile, TX services receive
>and manage the port control commands from the port layer.
>
>The control plane implements RX services that reside in the
>transaction layer. The services receive the downlink packets
>from the modem and transfer the packets to the corresponding
>port layer interfaces.
>
>Signed-off-by: Jack Wu <jackbb_wu at compal.com>
>---
> drivers/net/wwan/Kconfig                    |  5 ++++
> drivers/net/wwan/t9xx/Makefile              |  5 ++--
> drivers/net/wwan/t9xx/mtk_ctrl_plane.c      | 34 ++++++++++++++++++++++
> drivers/net/wwan/t9xx/mtk_ctrl_plane.h      | 22 +++++++++++++++
> drivers/net/wwan/t9xx/mtk_dev.c             | 44 +++++++++++++++++++++++++++++
> drivers/net/wwan/t9xx/mtk_dev.h             |  4 +++
> drivers/net/wwan/t9xx/pcie/Makefile         | 10 +++++++
> drivers/net/wwan/t9xx/pcie/mtk_pci.c        |  8 ++----
> drivers/net/wwan/t9xx/pcie/mtk_trans_ctrl.h | 21 ++++++++++++++
> 9 files changed, 146 insertions(+), 7 deletions(-)
>
>diff --git a/drivers/net/wwan/Kconfig b/drivers/net/wwan/Kconfig
>index 4cee537c739f..d8be12fb988c 100644
>--- a/drivers/net/wwan/Kconfig
>+++ b/drivers/net/wwan/Kconfig
>@@ -124,6 +124,7 @@ config MTK_T7XX
> config MTK_T9XX
> 	tristate "MediaTek PCIe 5G WWAN modem T9xx device"
> 	depends on PCI
>+	select MTK_T9XX_PCI
> 	select NET_DEVLINK
> 	help
> 	  Enables MediaTek PCIe based 5G WWAN modem (T9xx series) device.
>@@ -133,6 +134,10 @@ config MTK_T9XX
> 
> 	  If unsure, say N.
> 
>+config MTK_T9XX_PCI
>+	tristate
>+	depends on PCI && MTK_T9XX
>+
> endif # WWAN
> 
> endmenu
>diff --git a/drivers/net/wwan/t9xx/Makefile b/drivers/net/wwan/t9xx/Makefile
>index 6f2dd3f91454..ae9d6f2344ab 100644
>--- a/drivers/net/wwan/t9xx/Makefile
>+++ b/drivers/net/wwan/t9xx/Makefile
>@@ -4,7 +4,8 @@ ccflags-y += -I$(src)/pcie
> ccflags-y += -I$(src)
> 
> obj-$(CONFIG_MTK_T9XX) += mtk_t9xx.o
>+obj-$(CONFIG_MTK_T9XX_PCI) += pcie/
> 
> mtk_t9xx-y := \
>-	pcie/mtk_pci.o \
>-	pcie/mtk_pci_drv_m9xx.o
>+	mtk_dev.o \
>+	mtk_ctrl_plane.o
>diff --git a/drivers/net/wwan/t9xx/mtk_ctrl_plane.c b/drivers/net/wwan/t9xx/mtk_ctrl_plane.c
>new file mode 100644
>index 000000000000..ae5e1797b817
>--- /dev/null
>+++ b/drivers/net/wwan/t9xx/mtk_ctrl_plane.c
>@@ -0,0 +1,34 @@
>+// SPDX-License-Identifier: GPL-2.0-only
>+/*
>+ * Copyright (c) 2022, MediaTek Inc.
>+ * Copyright (c) 2022-2023, Intel Corporation.
>+ */
>+
>+#include <linux/device.h>
>+
>+#include "mtk_ctrl_plane.h"
>+

please add kdoc, especially there's EXPORT_SYMBOL

>+int mtk_ctrl_init(struct mtk_md_dev *mdev)
>+{
>+	struct mtk_ctrl_blk *ctrl_blk;
>+
>+	ctrl_blk = devm_kzalloc(mdev->dev, sizeof(*ctrl_blk), GFP_KERNEL);
>+	if (!ctrl_blk)
>+		return -ENOMEM;
>+
>+	ctrl_blk->mdev = mdev;
>+	mdev->ctrl_blk = ctrl_blk;
>+
>+	return 0;
>+}
>+EXPORT_SYMBOL(mtk_ctrl_init);
>+
>+int mtk_ctrl_exit(struct mtk_md_dev *mdev)

do we need int if 0 is always returned?

>+{
>+	struct mtk_ctrl_blk *ctrl_blk = mdev->ctrl_blk;
>+
>+	devm_kfree(mdev->dev, ctrl_blk);
>+
>+	return 0;
>+}
>+EXPORT_SYMBOL(mtk_ctrl_exit);
>diff --git a/drivers/net/wwan/t9xx/mtk_ctrl_plane.h b/drivers/net/wwan/t9xx/mtk_ctrl_plane.h
>new file mode 100644
>index 000000000000..8276be19b456
>--- /dev/null
>+++ b/drivers/net/wwan/t9xx/mtk_ctrl_plane.h
>@@ -0,0 +1,22 @@
>+/* SPDX-License-Identifier: GPL-2.0-only
>+ *
>+ * Copyright (c) 2022, MediaTek Inc.

shouldn't 2026 be put?

>+ */
>+
>+#ifndef __MTK_CTRL_PLANE_H__
>+#define __MTK_CTRL_PLANE_H__
>+
>+#include <linux/kref.h>
>+#include <linux/skbuff.h>
>+
>+#include "mtk_dev.h"
>+
>+struct mtk_ctrl_blk {
>+	struct mtk_md_dev *mdev;
>+	struct mtk_ctrl_trans *trans;
>+};
>+
>+int mtk_ctrl_init(struct mtk_md_dev *mdev);
>+int mtk_ctrl_exit(struct mtk_md_dev *mdev);
>+
>+#endif /* __MTK_CTRL_PLANE_H__ */
>diff --git a/drivers/net/wwan/t9xx/mtk_dev.c b/drivers/net/wwan/t9xx/mtk_dev.c
>new file mode 100644
>index 000000000000..f254ca7ed877
>--- /dev/null
>+++ b/drivers/net/wwan/t9xx/mtk_dev.c
>@@ -0,0 +1,44 @@
>+// SPDX-License-Identifier: GPL-2.0-only
>+/*
>+ * Copyright (c) 2022, MediaTek Inc.
>+ */
>+
>+#include <linux/module.h>
>+
>+#include "mtk_dev.h"
>+
>+struct mtk_md_dev *mtk_dev_alloc(struct device *pdev, const struct mtk_dev_ops *dev_ops)
>+{
>+	struct mtk_md_dev *mdev;
>+
>+	mdev = devm_kzalloc(pdev, sizeof(*mdev), GFP_KERNEL);
>+	if (!mdev)
>+		return NULL;
>+
>+	mdev->dev_ops = dev_ops;
>+	mdev->dev = pdev;
>+	return mdev;
>+}
>+EXPORT_SYMBOL(mtk_dev_alloc);
>+
>+void mtk_dev_free(struct mtk_md_dev *mdev)
>+{
>+	struct device *dev = mdev->dev;
>+
>+	devm_kfree(dev, mdev);
>+}
>+EXPORT_SYMBOL(mtk_dev_free);
>+
>+static int __init mtk_common_drv_init(void)
>+{
>+	return 0;
>+}
>+module_init(mtk_common_drv_init);
>+
>+static void __exit mtk_common_drv_exit(void)

is it used anywhere here in the patch?

>+{
>+}
>+module_exit(mtk_common_drv_exit);
>+
>+MODULE_DESCRIPTION("MediaTek T9xx PCIe WWAN driver");
>+MODULE_LICENSE("GPL");
>diff --git a/drivers/net/wwan/t9xx/mtk_dev.h b/drivers/net/wwan/t9xx/mtk_dev.h
>index 8278a0e2875e..37eec1a358fa 100644
>--- a/drivers/net/wwan/t9xx/mtk_dev.h
>+++ b/drivers/net/wwan/t9xx/mtk_dev.h
>@@ -57,6 +57,7 @@ struct mtk_md_dev {
> 	void *hw_priv;
> 	u32 hw_ver;
> 	char dev_str[MTK_DEV_STR_LEN];
>+	void *ctrl_blk;
> };
> 
> static inline u32 mtk_dev_get_dev_state(struct mtk_md_dev *mdev)
>@@ -105,4 +106,7 @@ static inline int mtk_dev_send_dev_evt(struct mtk_md_dev *mdev, u32 dev_evt)
> 	return mdev->dev_ops->send_dev_evt(mdev, dev_evt);
> }
> 
>+struct mtk_md_dev *mtk_dev_alloc(struct device *pdev, const struct mtk_dev_ops *dev_ops);
>+void mtk_dev_free(struct mtk_md_dev *mdev);
>+
> #endif /* __MTK_DEV_H__ */
>diff --git a/drivers/net/wwan/t9xx/pcie/Makefile b/drivers/net/wwan/t9xx/pcie/Makefile
>new file mode 100644
>index 000000000000..7410d1796d27
>--- /dev/null
>+++ b/drivers/net/wwan/t9xx/pcie/Makefile
>@@ -0,0 +1,10 @@
>+# SPDX-License-Identifier: GPL-2.0-only
>+
>+ccflags-y += -I$(src)
>+ccflags-y += -I$(src)/..
>+
>+obj-$(CONFIG_MTK_T9XX_PCI) += mtk_t9xx_pcie.o
>+
>+mtk_t9xx_pcie-y := \
>+	mtk_pci_drv_m9xx.o \
>+	mtk_pci.o
>diff --git a/drivers/net/wwan/t9xx/pcie/mtk_pci.c b/drivers/net/wwan/t9xx/pcie/mtk_pci.c
>index adec3ccdee08..518c32d55643 100644
>--- a/drivers/net/wwan/t9xx/pcie/mtk_pci.c
>+++ b/drivers/net/wwan/t9xx/pcie/mtk_pci.c
>@@ -14,6 +14,7 @@
> #include <linux/module.h>
> 
> #include "mtk_dev.h"
>+#include "mtk_trans_ctrl.h"
> #include "mtk_pci.h"
> #include "mtk_pci_reg.h"
> 
>@@ -385,8 +386,7 @@ static u32 mtk_pci_ext_h2d_evt_hw_bits(u32 chs)
> 
> 	SET_HW_BITS(hw_bits, chs, MHCCIF_RC2EP_EVT_DEVICE_RESET,
> 		    DEV_EVT_H2D_DEVICE_RESET);
>-	SET_HW_BITS(hw_bits, chs, MHCCIF_RC2EP_EVT_DRM_DISABLE_AP,
>-		    EXT_EVT_H2D_DRM_DISABLE_AP);
>+
> 	return LE32_TO_U32(cpu_to_le32(hw_bits));
> }
> 
>@@ -779,13 +779,11 @@ static int mtk_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> 	struct mtk_md_dev *mdev;
> 	int ret;
> 
>-	mdev = devm_kzalloc(dev, sizeof(*mdev), GFP_KERNEL);
>+	mdev = mtk_dev_alloc(dev, &pci_hw_ops);
> 	if (!mdev) {
> 		ret = -ENOMEM;
> 		goto out;
> 	}
>-	mdev->dev_ops = &pci_hw_ops;
>-	mdev->dev = dev;
> 
> 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> 	if (!priv) {
>diff --git a/drivers/net/wwan/t9xx/pcie/mtk_trans_ctrl.h b/drivers/net/wwan/t9xx/pcie/mtk_trans_ctrl.h
>new file mode 100644
>index 000000000000..d6de4c43b529
>--- /dev/null
>+++ b/drivers/net/wwan/t9xx/pcie/mtk_trans_ctrl.h
>@@ -0,0 +1,21 @@
>+/* SPDX-License-Identifier: GPL-2.0-only
>+ *
>+ * Copyright (c) 2022, MediaTek Inc.
>+ */
>+
>+#ifndef __MTK_TRANS_CTRL_H__
>+#define __MTK_TRANS_CTRL_H__
>+
>+#include <linux/kref.h>
>+#include <linux/list.h>
>+#include <linux/skbuff.h>
>+#include <linux/types.h>
>+
>+#include "mtk_dev.h"
>+
>+struct mtk_ctrl_trans {
>+	struct mtk_ctrl_blk *ctrl_blk;
>+	struct mtk_md_dev *mdev;
>+};
>+
>+#endif
>
>-- 
>2.34.1





More information about the linux-arm-kernel mailing list