wifi: brcmfmac: add support for Cypress firmware api
authorArend van Spriel <arend.vanspriel@broadcom.com>
Tue, 29 Nov 2022 13:54:43 +0000 (14:54 +0100)
committerKalle Valo <kvalo@kernel.org>
Thu, 8 Dec 2022 14:44:07 +0000 (16:44 +0200)
Cypress uses the brcmfmac driver and releases firmware which will
likely diverge over time (or already has). So adding support for
handling that.

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-5-arend.vanspriel@broadcom.com
drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/Makefile [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c

index e7ceea7af13f33c8ed7546cbb02e948b02c0761f..64fd77a378fdf58589bff4cf43f7b8548c7651b1 100644 (file)
@@ -51,6 +51,8 @@ brcmfmac-$(CONFIG_DMI) += \
 
 ifeq ($(CONFIG_BRCMFMAC),m)
 obj-m += wcc/
+obj-m += cyw/
 else
 brcmfmac-$(CONFIG_BRCMFMAC) += wcc/core.o
+brcmfmac-$(CONFIG_BRCMFMAC) += cyw/core.o
 endif
index fa919432b1c6bd6857cff023b208c524ac81318b..b7c918f241c91e77ce30876232f25f5ba80fe031 100644 (file)
@@ -959,36 +959,36 @@ out:
        return ret;
 }
 
-#define BRCMF_SDIO_DEVICE(dev_id)      \
+#define BRCMF_SDIO_DEVICE(dev_id, fw_vend) \
        { \
                SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id), \
-               .driver_data = BRCMF_FWVENDOR_WCC \
+               .driver_data = BRCMF_FWVENDOR_ ## fw_vend \
        }
 
 /* devices we support, null terminated */
 static const struct sdio_device_id brcmf_sdmmc_ids[] = {
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43143),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43241),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4329),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4330),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4334),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43439),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43752),
-       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43143, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43241, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4329, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4330, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4334, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359, WCC),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373, CYW),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012, CYW),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43439, CYW),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43752, CYW),
+       BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359, CYW),
        { /* end: all zeroes */ }
 };
 MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
index 26be49ee8c9053b754f056de470e91d85ec1a5ae..72036fec9a8ed36663f80bbad65b21b656d8f865 100644 (file)
@@ -33,6 +33,7 @@
 
 enum brcmf_fwvendor {
        BRCMF_FWVENDOR_WCC,
+       BRCMF_FWVENDOR_CYW,
        /* keep last */
        BRCMF_FWVENDOR_NUM,
        BRCMF_FWVENDOR_INVALID
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/Makefile
new file mode 100644 (file)
index 0000000..5e1fdda
--- /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-cyw.o
+brcmfmac-cyw-objs += \
+               core.o module.o
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c
new file mode 100644 (file)
index 0000000..b75652b
--- /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_cyw_attach(struct brcmf_pub *drvr)
+{
+       pr_err("%s: executing\n", __func__);
+       return 0;
+}
+
+static void brcmf_cyw_detach(struct brcmf_pub *drvr)
+{
+       pr_err("%s: executing\n", __func__);
+}
+
+const struct brcmf_fwvid_ops brcmf_cyw_ops = {
+       .attach = brcmf_cyw_attach,
+       .detach = brcmf_cyw_detach,
+};
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
new file mode 100644 (file)
index 0000000..3429472
--- /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_cyw_init(void)
+{
+       return brcmf_fwvid_register_vendor(BRCMF_FWVENDOR_CYW, THIS_MODULE,
+                                          &brcmf_cyw_ops);
+}
+
+static void __exit brcmf_cyw_exit(void)
+{
+       brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_CYW, THIS_MODULE);
+}
+
+MODULE_LICENSE("Dual BSD/GPL");
+
+module_init(brcmf_cyw_init);
+module_exit(brcmf_cyw_exit);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h
new file mode 100644 (file)
index 0000000..870b5be
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef _BRCMFMAC_CYW_VOPS_H
+#define _BRCMFMAC_CYW_VOPS_H
+
+extern const struct brcmf_fwvid_ops brcmf_cyw_ops;
+#define CYW_VOPS       (&brcmf_cyw_ops)
+
+#endif /* _BRCMFMAC_CYW_VOPS_H */
index f5cbb09b1c83fbfdf85620825a5ba361b96e68ba..ee23eb1809c4ae0126540cf94712f413728c6c4c 100644 (file)
@@ -19,6 +19,7 @@
 #include "fwvid.h"
 
 #include "wcc/vops.h"
+#include "cyw/vops.h"
 
 struct brcmf_fwvid_entry {
        const char *name;
@@ -50,6 +51,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),
 };
 
 #if IS_MODULE(CONFIG_BRCMFMAC)