wifi: brcmfmac: add support Broadcom BCA firmware api
authorArend van Spriel <arend.vanspriel@broadcom.com>
Tue, 29 Nov 2022 13:54:44 +0000 (14:54 +0100)
committerKalle Valo <kvalo@kernel.org>
Thu, 8 Dec 2022 14:44:07 +0000 (16:44 +0200)
Broadcom BCA division develops its own firmware api and as such will
likely diverge over time (or already has). Add support for handling
this.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221129135446.151065-6-arend.vanspriel@broadcom.com
drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/Makefile [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c

index 64fd77a378fdf58589bff4cf43f7b8548c7651b1..0e996cf24f882915c2652ddec28cc332c2ceda35 100644 (file)
@@ -52,7 +52,9 @@ brcmfmac-$(CONFIG_DMI) += \
 ifeq ($(CONFIG_BRCMFMAC),m)
 obj-m += wcc/
 obj-m += cyw/
+obj-m += bca/
 else
 brcmfmac-$(CONFIG_BRCMFMAC) += wcc/core.o
 brcmfmac-$(CONFIG_BRCMFMAC) += cyw/core.o
+brcmfmac-$(CONFIG_BRCMFMAC) += bca/core.o
 endif
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/Makefile
new file mode 100644 (file)
index 0000000..4609870
--- /dev/null
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: ISC
+#
+# Copyright (c) 2022 Broadcom Corporation
+
+ccflags-y += \
+       -I $(srctree)/$(src) \
+       -I $(srctree)/$(src)/.. \
+       -I $(srctree)/$(src)/../../include
+
+obj-m += brcmfmac-bca.o
+brcmfmac-bca-objs += \
+               core.o module.o
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c
new file mode 100644 (file)
index 0000000..ac3a36f
--- /dev/null
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <core.h>
+#include <bus.h>
+#include <fwvid.h>
+
+#include "vops.h"
+
+static int brcmf_bca_attach(struct brcmf_pub *drvr)
+{
+       pr_err("%s: executing\n", __func__);
+       return 0;
+}
+
+static void brcmf_bca_detach(struct brcmf_pub *drvr)
+{
+       pr_err("%s: executing\n", __func__);
+}
+
+const struct brcmf_fwvid_ops brcmf_bca_ops = {
+       .attach = brcmf_bca_attach,
+       .detach = brcmf_bca_detach,
+};
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
new file mode 100644 (file)
index 0000000..790116a
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#include <linux/module.h>
+#include <bus.h>
+#include <core.h>
+#include <fwvid.h>
+
+#include "vops.h"
+
+static int __init brcmf_bca_init(void)
+{
+       return brcmf_fwvid_register_vendor(BRCMF_FWVENDOR_BCA, THIS_MODULE,
+                                          &brcmf_bca_ops);
+}
+
+static void __exit brcmf_bca_exit(void)
+{
+       brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_BCA, THIS_MODULE);
+}
+
+MODULE_LICENSE("Dual BSD/GPL");
+
+module_init(brcmf_bca_init);
+module_exit(brcmf_bca_exit);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h
new file mode 100644 (file)
index 0000000..7897e6b
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef _BRCMFMAC_BCA_VOPS_H
+#define _BRCMFMAC_BCA_VOPS_H
+
+extern const struct brcmf_fwvid_ops brcmf_bca_ops;
+#define BCA_VOPS       (&brcmf_bca_ops)
+
+#endif /* _BRCMFMAC_BCA_VOPS_H */
index 72036fec9a8ed36663f80bbad65b21b656d8f865..501136e011b552ab3b9192f0c1307281a7d024aa 100644 (file)
@@ -34,6 +34,7 @@
 enum brcmf_fwvendor {
        BRCMF_FWVENDOR_WCC,
        BRCMF_FWVENDOR_CYW,
+       BRCMF_FWVENDOR_BCA,
        /* keep last */
        BRCMF_FWVENDOR_NUM,
        BRCMF_FWVENDOR_INVALID
index ee23eb1809c4ae0126540cf94712f413728c6c4c..274d512cbdad4d40fbd34fe37f565b34e6795744 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "wcc/vops.h"
 #include "cyw/vops.h"
+#include "bca/vops.h"
 
 struct brcmf_fwvid_entry {
        const char *name;
@@ -52,6 +53,7 @@ static DEFINE_MUTEX(fwvid_list_lock);
 static struct brcmf_fwvid_entry fwvid_list[BRCMF_FWVENDOR_NUM] = {
        FWVID_ENTRY_INIT(WCC, wcc),
        FWVID_ENTRY_INIT(CYW, cyw),
+       FWVID_ENTRY_INIT(BCA, bca),
 };
 
 #if IS_MODULE(CONFIG_BRCMFMAC)
index 094bb84ed72f1ec22cb4d369a2a35e3bcb2329ab..3e121e56e8009e9e2a78085393c2f74865dc418f 100644 (file)
@@ -2571,47 +2571,47 @@ static const struct dev_pm_ops brcmf_pciedrvr_pm = {
 #endif /* CONFIG_PM */
 
 
-#define BRCMF_PCIE_DEVICE(dev_id) \
+#define BRCMF_PCIE_DEVICE(dev_id, fw_vend) \
        { \
                BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
                PCI_ANY_ID, PCI_ANY_ID, \
                PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
-               BRCMF_FWVENDOR_WCC \
+               BRCMF_FWVENDOR_ ## fw_vend \
        }
-#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev) \
+#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev, fw_vend) \
        { \
                BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
                (subvend), (subdev), \
                PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
-               BRCMF_FWVENDOR_WCC \
+               BRCMF_FWVENDOR_ ## fw_vend \
        }
 
 static const struct pci_device_id brcmf_pcie_devid_table[] = {
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
-       BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_RAW_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4358_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4359_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4364_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID),
-       BRCMF_PCIE_DEVICE_SUB(0x4365, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4365),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(CY_PCIE_89459_DEVICE_ID),
-       BRCMF_PCIE_DEVICE(CY_PCIE_89459_RAW_DEVICE_ID),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_RAW_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4358_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4359_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4364_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE_SUB(0x4365, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4365, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID, BCA),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID, WCC),
+       BRCMF_PCIE_DEVICE(CY_PCIE_89459_DEVICE_ID, CYW),
+       BRCMF_PCIE_DEVICE(CY_PCIE_89459_RAW_DEVICE_ID, CYW),
        { /* end: all zeroes */ }
 };