--- /dev/null
+From 4e7e471e2e3f9085fe1dbe821c4dd904a917c66a Mon Sep 17 00:00:00 2001
+Date: Fri, 1 Aug 2025 09:12:25 +0200
+Subject: [PATCH] net: airoha: npu: Add missing MODULE_FIRMWARE macros
+
+Introduce missing MODULE_FIRMWARE definitions for firmware autoload.
+
+Fixes: 23290c7bc190d ("net: airoha: Introduce Airoha NPU support")
+Link: https://patch.msgid.link/20250801-airoha-npu-missing-module-firmware-v2-1-e860c824d515@kernel.org
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -741,6 +741,8 @@ static struct platform_driver airoha_npu
+ };
+ module_platform_driver(airoha_npu_driver);
+
++MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA);
++MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32);
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("Airoha Network Processor Unit driver");
--- /dev/null
+From 1e5e40f2558c07f6bc60a8983000309cc0a9d600 Mon Sep 17 00:00:00 2001
+Date: Tue, 15 Jul 2025 18:01:10 -0500
+Subject: [PATCH] net: airoha: Fix a NULL vs IS_ERR() bug in
+ airoha_npu_run_firmware()
+
+The devm_ioremap_resource() function returns error pointers. It never
+returns NULL. Update the check to match.
+
+Fixes: e27dba1951ce ("net: Use of_reserved_mem_region_to_resource{_byname}() for "memory-region"")
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -201,8 +201,8 @@ static int airoha_npu_run_firmware(struc
+ }
+
+ addr = devm_ioremap(dev, rmem->base, rmem->size);
+- if (!addr) {
+- ret = -ENOMEM;
++ if (IS_ERR(addr)) {
++ ret = PTR_ERR(addr);
+ goto out;
+ }
+
--- /dev/null
+From 0850ae496d534847ec2c26744521c1bce04ec59d Mon Sep 17 00:00:00 2001
+Date: Mon, 13 Oct 2025 15:58:50 +0200
+Subject: [PATCH 2/3] net: airoha: npu: Add airoha_npu_soc_data struct
+
+Introduce airoha_npu_soc_data structure in order to generalize per-SoC
+NPU firmware info. Introduce airoha_npu_load_firmware utility routine.
+This is a preliminary patch in order to introduce AN7583 NPU support.
+
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 77 ++++++++++++++++--------
+ 1 file changed, 51 insertions(+), 26 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -103,6 +103,16 @@ enum {
+ QDMA_WAN_PON_XDSL,
+ };
+
++struct airoha_npu_fw {
++ const char *name;
++ int max_size;
++};
++
++struct airoha_npu_soc_data {
++ struct airoha_npu_fw fw_rv32;
++ struct airoha_npu_fw fw_data;
++};
++
+ #define MBOX_MSG_FUNC_ID GENMASK(14, 11)
+ #define MBOX_MSG_STATIC_BUF BIT(5)
+ #define MBOX_MSG_STATUS GENMASK(4, 2)
+@@ -182,49 +192,53 @@ static int airoha_npu_send_msg(struct ai
+ return ret;
+ }
+
+-static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
+- struct reserved_mem *rmem)
++static int airoha_npu_load_firmware(struct device *dev, void __iomem *addr,
++ const struct airoha_npu_fw *fw_info)
+ {
+ const struct firmware *fw;
+- void __iomem *addr;
+ int ret;
+
+- ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_RV32, dev);
++ ret = request_firmware(&fw, fw_info->name, dev);
+ if (ret)
+ return ret == -ENOENT ? -EPROBE_DEFER : ret;
+
+- if (fw->size > NPU_EN7581_FIRMWARE_RV32_MAX_SIZE) {
++ if (fw->size > fw_info->max_size) {
+ dev_err(dev, "%s: fw size too overlimit (%zu)\n",
+- NPU_EN7581_FIRMWARE_RV32, fw->size);
++ fw_info->name, fw->size);
+ ret = -E2BIG;
+ goto out;
+ }
+
+- addr = devm_ioremap(dev, rmem->base, rmem->size);
+- if (IS_ERR(addr)) {
+- ret = PTR_ERR(addr);
+- goto out;
+- }
+-
+ memcpy_toio(addr, fw->data, fw->size);
++out:
+ release_firmware(fw);
+
+- ret = request_firmware(&fw, NPU_EN7581_FIRMWARE_DATA, dev);
+- if (ret)
+- return ret == -ENOENT ? -EPROBE_DEFER : ret;
++ return ret;
++}
+
+- if (fw->size > NPU_EN7581_FIRMWARE_DATA_MAX_SIZE) {
+- dev_err(dev, "%s: fw size too overlimit (%zu)\n",
+- NPU_EN7581_FIRMWARE_DATA, fw->size);
+- ret = -E2BIG;
+- goto out;
+- }
++static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
++ struct reserved_mem *rmem)
++{
++ const struct airoha_npu_soc_data *soc;
++ void __iomem *addr;
++ int ret;
+
+- memcpy_toio(base + REG_NPU_LOCAL_SRAM, fw->data, fw->size);
+-out:
+- release_firmware(fw);
++ soc = of_device_get_match_data(dev);
++ if (!soc)
++ return -EINVAL;
+
+- return ret;
++ addr = devm_ioremap(dev, rmem->base, rmem->size);
++ if (IS_ERR(addr))
++ return PTR_ERR(addr);
++
++ /* Load rv32 npu firmware */
++ ret = airoha_npu_load_firmware(dev, addr, &soc->fw_rv32);
++ if (ret)
++ return ret;
++
++ /* Load data npu firmware */
++ return airoha_npu_load_firmware(dev, base + REG_NPU_LOCAL_SRAM,
++ &soc->fw_data);
+ }
+
+ static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance)
+@@ -596,8 +610,19 @@ void airoha_npu_put(struct airoha_npu *n
+ }
+ EXPORT_SYMBOL_GPL(airoha_npu_put);
+
++static const struct airoha_npu_soc_data en7581_npu_soc_data = {
++ .fw_rv32 = {
++ .name = NPU_EN7581_FIRMWARE_RV32,
++ .max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE,
++ },
++ .fw_data = {
++ .name = NPU_EN7581_FIRMWARE_DATA,
++ .max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE,
++ },
++};
++
+ static const struct of_device_id of_airoha_npu_match[] = {
+- { .compatible = "airoha,en7581-npu" },
++ { .compatible = "airoha,en7581-npu", .data = &en7581_npu_soc_data },
+ { /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, of_airoha_npu_match);
--- /dev/null
+From 4478596f71d92060c9093bdf1d2d940881f41bcc Mon Sep 17 00:00:00 2001
+Date: Mon, 13 Oct 2025 15:58:51 +0200
+Subject: [PATCH 3/3] net: airoha: npu: Add 7583 SoC support
+
+Introduce support for Airoha 7583 SoC NPU selecting proper firmware images.
+
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -16,6 +16,8 @@
+
+ #define NPU_EN7581_FIRMWARE_DATA "airoha/en7581_npu_data.bin"
+ #define NPU_EN7581_FIRMWARE_RV32 "airoha/en7581_npu_rv32.bin"
++#define NPU_AN7583_FIRMWARE_DATA "airoha/an7583_npu_data.bin"
++#define NPU_AN7583_FIRMWARE_RV32 "airoha/an7583_npu_rv32.bin"
+ #define NPU_EN7581_FIRMWARE_RV32_MAX_SIZE 0x200000
+ #define NPU_EN7581_FIRMWARE_DATA_MAX_SIZE 0x10000
+ #define NPU_DUMP_SIZE 512
+@@ -621,8 +623,20 @@ static const struct airoha_npu_soc_data
+ },
+ };
+
++static const struct airoha_npu_soc_data an7583_npu_soc_data = {
++ .fw_rv32 = {
++ .name = NPU_AN7583_FIRMWARE_RV32,
++ .max_size = NPU_EN7581_FIRMWARE_RV32_MAX_SIZE,
++ },
++ .fw_data = {
++ .name = NPU_AN7583_FIRMWARE_DATA,
++ .max_size = NPU_EN7581_FIRMWARE_DATA_MAX_SIZE,
++ },
++};
++
+ static const struct of_device_id of_airoha_npu_match[] = {
+ { .compatible = "airoha,en7581-npu", .data = &en7581_npu_soc_data },
++ { .compatible = "airoha,an7583-npu", .data = &an7583_npu_soc_data },
+ { /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, of_airoha_npu_match);
+@@ -768,6 +782,8 @@ module_platform_driver(airoha_npu_driver
+
+ MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA);
+ MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32);
++MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_DATA);
++MODULE_FIRMWARE(NPU_AN7583_FIRMWARE_RV32);
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("Airoha Network Processor Unit driver");