[PATCH wireless-next 05/35] wifi: mm81x: add core.c
From: Lachlan Hodges
Date: Thu Feb 26 2026 - 23:15:28 EST
(Patches split per file for review, see cover letter for more
information)
Signed-off-by: Lachlan Hodges <lachlan.hodges@xxxxxxxxxxxxxx>
---
drivers/net/wireless/morsemicro/mm81x/core.c | 157 +++++++++++++++++++
1 file changed, 157 insertions(+)
create mode 100644 drivers/net/wireless/morsemicro/mm81x/core.c
diff --git a/drivers/net/wireless/morsemicro/mm81x/core.c b/drivers/net/wireless/morsemicro/mm81x/core.c
new file mode 100644
index 000000000000..1bcb9b5a00c9
--- /dev/null
+++ b/drivers/net/wireless/morsemicro/mm81x/core.c
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2017-2026 Morse Micro
+ */
+#include <linux/module.h>
+#include "core.h"
+#include "debug.h"
+#include "bus.h"
+#include "hif.h"
+
+unsigned int mm81x_debug_mask;
+module_param_named(debug_mask, mm81x_debug_mask, uint, 0644);
+MODULE_PARM_DESC(debug_mask, "mm81x debug mask");
+
+char board_config_file[BCF_SIZE_MAX] = "";
+module_param_string(bcf, board_config_file, sizeof(board_config_file), 0644);
+MODULE_PARM_DESC(bcf, "BCF filename to load");
+
+int mm81x_core_attach_regs(struct mm81x *mm)
+{
+ int ret = 0;
+
+ mm81x_claim_bus(mm);
+ ret = mm81x_reg32_read(mm, MM8108_REG_CHIP_ID, &mm->chip_id);
+ mm81x_release_bus(mm);
+
+ if (ret < 0) {
+ mm81x_err(mm, "failed to read chip id %d", ret);
+ return ret;
+ }
+
+ switch (mm->chip_id) {
+ case (MM8108B2_ID):
+ mm->regs = &mm8108_regs;
+ mm->hif.ops = &mm81x_yaps_ops;
+ break;
+ default:
+ return -ENODEV;
+ }
+
+ return ret;
+}
+
+static char *mm81x_core_get_revision_string(u32 chip_id)
+{
+ u8 chip_rev = MM81X_DEVICE_GET_CHIP_REV(chip_id);
+
+ switch (chip_rev) {
+ case MM8108B2_REV:
+ return MM8108B2_REV_STRING;
+ default:
+ return "??";
+ }
+}
+
+void mm81x_core_init_mac_addr(struct mm81x *mm)
+{
+ int ret = mm81x_hw_otp_get_mac_addr(mm);
+
+ if (ret || !is_valid_ether_addr(mm->macaddr))
+ eth_random_addr(mm->macaddr);
+}
+
+char *mm81x_core_get_fw_path(u32 chip_id)
+{
+ return kasprintf(GFP_KERNEL,
+ MM81X_FW_DIR "/" MM8108_FW_BASE
+ "%s" FW_ROM_LINKED_STRING MM81X_FW_EXT,
+ mm81x_core_get_revision_string(chip_id));
+}
+
+int mm81x_core_create(struct mm81x *mm)
+{
+ int ret;
+
+ set_bit(MM81X_STATE_CHIP_UNRESPONSIVE, &mm->state_flags);
+ set_bit(MM81X_STATE_RELOAD_FW_AFTER_START, &mm->state_flags);
+
+ mm->chip_wq = create_singlethread_workqueue("chip_wq");
+ if (!mm->chip_wq) {
+ mm81x_err(mm, "create_singlethread_workqueue failed");
+ return -ENOMEM;
+ }
+
+ mm->net_wq = create_singlethread_workqueue("net_wq");
+ if (!mm->net_wq) {
+ mm81x_err(mm, "create_singlethread_workqueue failed");
+ ret = -ENOMEM;
+ goto err_chip_wq;
+ }
+
+ ret = mm81x_hif_init(mm);
+ if (ret) {
+ mm81x_err(mm, "mm81x_hif_init failed: %d", ret);
+ goto err_wqs;
+ }
+
+ return 0;
+
+err_wqs:
+ flush_workqueue(mm->net_wq);
+ destroy_workqueue(mm->net_wq);
+
+err_chip_wq:
+ flush_workqueue(mm->chip_wq);
+ destroy_workqueue(mm->chip_wq);
+
+ return ret;
+}
+
+void mm81x_core_destroy(struct mm81x *mm)
+{
+ mm81x_hif_finish(mm);
+ flush_workqueue(mm->net_wq);
+ destroy_workqueue(mm->net_wq);
+ flush_workqueue(mm->chip_wq);
+ destroy_workqueue(mm->chip_wq);
+}
+
+static int __init mm81x_init(void)
+{
+ int ret = 0;
+
+ pr_info("Morse Micro mm81x driver registration. Version %s\n",
+ DRV_VERSION);
+
+#ifdef CONFIG_MM81X_USB
+ ret = mm81x_usb_init();
+ if (ret)
+ pr_err("mm81x_usb_init() failed: %d\n", ret);
+#endif
+#ifdef CONFIG_MM81X_SDIO
+ ret = mm81x_sdio_init();
+ if (ret)
+ pr_err("mm81x_sdio_init() failed: %d\n", ret);
+#endif
+
+ return ret;
+}
+
+static void __exit mm81x_exit(void)
+{
+#ifdef CONFIG_MM81X_USB
+ mm81x_usb_exit();
+#endif
+#ifdef CONFIG_MM81X_SDIO
+ mm81x_sdio_exit();
+#endif
+}
+
+module_init(mm81x_init);
+module_exit(mm81x_exit);
+
+MODULE_AUTHOR("Morse Micro");
+MODULE_DESCRIPTION("Driver support for Morse Micro MM81X SDIO/USB devices");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_VERSION("1.0");
--
2.43.0