All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/7] brcmfmac: add function to unbind device to bus layer api
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
@ 2022-06-13  9:19 ` aspriel
  2022-06-13  9:19 ` [PATCH 2/7] brcmfmac: add firmware vendor info in driver data aspriel
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

Introduce a new bus callback .remove() which will unbind the device
from the driver. This allows the common driver layer to stop handling
a device.

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>
---
 .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h  | 13 +++++++++++++
 .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 +++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 3f5da3bb6aa5..a9363de809ea 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -6,6 +6,7 @@
 #ifndef BRCMFMAC_BUS_H
 #define BRCMFMAC_BUS_H

+#include <linux/device.h>
 #include "debug.h"

 /* IDs of the 6 default common rings of msgbuf protocol */
@@ -61,6 +62,7 @@ struct brcmf_bus_dcmd {
  * @get_ramsize: obtain size of device memory.
  * @get_memdump: obtain device memory dump in provided buffer.
  * @get_fwname: obtain firmware name.
+ * @remove: initiate unbind of the device.
  *
  * This structure provides an abstract interface towards the
  * bus specific driver. For control messages to common driver
@@ -81,6 +83,7 @@ struct brcmf_bus_ops {
 			  unsigned char *fw_name);
 	void (*debugfs_create)(struct device *dev);
 	int (*reset)(struct device *dev);
+	void (*remove)(struct device *dev);
 };


@@ -244,6 +247,16 @@ int brcmf_bus_reset(struct brcmf_bus *bus)
 	return bus->ops->reset(bus->dev);
 }

+static inline void brcmf_bus_remove(struct brcmf_bus *bus)
+{
+	if (!bus->ops->remove) {
+		device_release_driver(bus->dev);
+		return;
+	}
+
+	bus->ops->remove(bus->dev);
+}
+
 /*
  * interface functions from common layer
  */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 212fbbe1cd7e..be2e50ed6e1c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -4179,6 +4179,15 @@ static int brcmf_sdio_bus_reset(struct device *dev)
 	return ret;
 }

+static void brcmf_sdio_bus_remove(struct device *dev)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_sdio_dev *sdiod = bus_if->bus_priv.sdio;
+
+	device_release_driver(&sdiod->func2->dev);
+	device_release_driver(&sdiod->func1->dev);
+}
+
 static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
 	.stop = brcmf_sdio_bus_stop,
 	.preinit = brcmf_sdio_bus_preinit,
@@ -4191,7 +4200,8 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
 	.get_memdump = brcmf_sdio_bus_get_memdump,
 	.get_fwname = brcmf_sdio_get_fwname,
 	.debugfs_create = brcmf_sdio_debugfs_create,
-	.reset = brcmf_sdio_bus_reset
+	.reset = brcmf_sdio_bus_reset,
+	.remove = brcmf_sdio_bus_remove,
 };

 #define BRCMF_SDIO_FW_CODE	0
-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 2/7] brcmfmac: add firmware vendor info in driver data
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
  2022-06-13  9:19 ` [PATCH 1/7] brcmfmac: add function to unbind device to bus layer api aspriel
@ 2022-06-13  9:19 ` aspriel
  2022-07-28  9:31   ` Kalle Valo
  2022-06-13  9:19 ` [PATCH 4/7] brcmfmac: add support for Cypress firmware api aspriel
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

In order to determine the vendor that released a firmware image for
a specific device, the device table now sets the vendor identifier
and it is stored in struct brcmf_bus::fwvid during probe.

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>
---
 .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  6 ++++-
 .../broadcom/brcm80211/brcmfmac/bus.h         | 11 +++++++-
 .../broadcom/brcm80211/brcmfmac/pcie.c        | 20 ++++++++++----
 .../broadcom/brcm80211/brcmfmac/usb.c         | 27 +++++++++++++------
 4 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index 9c598ea97499..5ec56567dab6 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
@@ -968,7 +968,10 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
 }

 #define BRCMF_SDIO_DEVICE(dev_id)	\
-	{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id)}
+	{ \
+		SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id), \
+		.driver_data = BRCMF_FWVENDOR_WCC \
+	}

 /* devices we support, null terminated */
 static const struct sdio_device_id brcmf_sdmmc_ids[] = {
@@ -1058,6 +1061,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
 	sdiodev->bus_if = bus_if;
 	bus_if->bus_priv.sdio = sdiodev;
 	bus_if->proto_type = BRCMF_PROTO_BCDC;
+	bus_if->fwvid = id->driver_data;
 	dev_set_drvdata(&func->dev, bus_if);
 	dev_set_drvdata(&sdiodev->func1->dev, bus_if);
 	sdiodev->dev = &sdiodev->func1->dev;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index a9363de809ea..2008fde3ff4e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -23,6 +23,13 @@
 #define BRCMF_NROF_COMMON_MSGRINGS	(BRCMF_NROF_H2D_COMMON_MSGRINGS + \
 					 BRCMF_NROF_D2H_COMMON_MSGRINGS)

+enum brcmf_fwvendor {
+	BRCMF_FWVENDOR_WCC,
+	/* keep last */
+	BRCMF_FWVENDOR_NUM,
+	BRCMF_FWVENDOR_INVALID
+};
+
 /* The level of bus communication with the dongle */
 enum brcmf_bus_state {
 	BRCMF_BUS_DOWN,		/* Not ready for frame transfers */
@@ -131,9 +138,10 @@ struct brcmf_bus_stats {
  * @stats: statistics shared between common and bus layer.
  * @maxctl: maximum size for rxctl request message.
  * @chip: device identifier of the dongle chip.
+ * @chiprev: revision of the dongle chip.
+ * @fwvid: firmware vendor-support identifier of the device.
  * @always_use_fws_queue: bus wants use queue also when fwsignal is inactive.
  * @wowl_supported: is wowl supported by bus driver.
- * @chiprev: revision of the dongle chip.
  * @msgbuf: msgbuf protocol parameters provided by bus layer.
  */
 struct brcmf_bus {
@@ -150,6 +158,7 @@ struct brcmf_bus {
 	uint maxctl;
 	u32 chip;
 	u32 chiprev;
+	enum brcmf_fwvendor fwvid;
 	bool always_use_fws_queue;
 	bool wowl_supported;

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 97f0f13dfe50..0599dad96018 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -1910,6 +1910,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const
struct pci_device_id *id)
 	bus->bus_priv.pcie = pcie_bus_dev;
 	bus->ops = &brcmf_pcie_bus_ops;
 	bus->proto_type = BRCMF_PROTO_MSGBUF;
+	bus->fwvid = id->driver_data;
 	bus->chip = devinfo->coreid;
 	bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
 	dev_set_drvdata(&pdev->dev, bus);
@@ -2076,11 +2077,20 @@ static const struct dev_pm_ops brcmf_pciedrvr_pm = {
 #endif /* CONFIG_PM */


-#define BRCMF_PCIE_DEVICE(dev_id)	{ BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
-	PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
-#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev)	{ \
-	BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
-	subvend, subdev, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
+#define BRCMF_PCIE_DEVICE(dev_id) \
+	{ \
+		BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
+		PCI_ANY_ID, PCI_ANY_ID, \
+		PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
+		BRCMF_FWVENDOR_WCC \
+	}
+#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev) \
+	{ \
+		BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
+		(subvend), (subdev), \
+		PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
+		BRCMF_FWVENDOR_WCC \
+	}

 static const struct pci_device_id brcmf_pcie_devid_table[] = {
 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
index 9fb68c2dc7e3..e34523c8a275 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
@@ -1253,7 +1253,8 @@ brcmf_usb_prepare_fw_request(struct
brcmf_usbdev_info *devinfo)
 	return fwreq;
 }

-static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
+static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo,
+			      enum brcmf_fwvendor fwvid)
 {
 	struct brcmf_bus *bus = NULL;
 	struct brcmf_usbdev *bus_pub = NULL;
@@ -1278,6 +1279,7 @@ static int brcmf_usb_probe_cb(struct
brcmf_usbdev_info *devinfo)
 	dev_set_drvdata(dev, bus);
 	bus->ops = &brcmf_usb_bus_ops;
 	bus->proto_type = BRCMF_PROTO_BCDC;
+	bus->fwvid = fwvid;
 	bus->always_use_fws_queue = true;
 #ifdef CONFIG_PM
 	bus->wowl_supported = true;
@@ -1436,7 +1438,7 @@ brcmf_usb_probe(struct usb_interface *intf,
const struct usb_device_id *id)
 	else
 		brcmf_dbg(USB, "Broadcom full speed USB WLAN interface detected\n");

-	ret = brcmf_usb_probe_cb(devinfo);
+	ret = brcmf_usb_probe_cb(devinfo, id->driver_info);
 	if (ret)
 		goto fail;

@@ -1524,14 +1526,23 @@ static int brcmf_usb_reset_resume(struct
usb_interface *intf)
 	return ret;
 }

-#define BRCMF_USB_DEVICE(dev_id)	\
-	{ USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id) }
+#define BRCMF_USB_DEVICE(dev_id) \
+	{ \
+		USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id), \
+		.driver_info = BRCMF_FWVENDOR_WCC \
+	}

-#define LINKSYS_USB_DEVICE(dev_id)	\
-	{ USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) }
+#define LINKSYS_USB_DEVICE(dev_id) \
+	{ \
+		USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id), \
+		.driver_info = BRCMF_FWVENDOR_WCC \
+	}

-#define CYPRESS_USB_DEVICE(dev_id)	\
-	{ USB_DEVICE(CY_USB_VENDOR_ID_CYPRESS, dev_id) }
+#define CYPRESS_USB_DEVICE(dev_id) \
+	{ \
+		USB_DEVICE(CY_USB_VENDOR_ID_CYPRESS, dev_id), \
+		.driver_info = BRCMF_FWVENDOR_WCC \
+	}

 static const struct usb_device_id brcmf_usb_devid_table[] = {
 	BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID),
-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 3/7] brcmfmac: add support for vendor-specific firmware api
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
                   ` (2 preceding siblings ...)
  2022-06-13  9:19 ` [PATCH 4/7] brcmfmac: add support for Cypress firmware api aspriel
@ 2022-06-13  9:19 ` aspriel
  2022-07-28  9:36   ` Kalle Valo
  2022-06-13  9:19 ` [PATCH 5/7] brcmfmac: add support Broadcom BCA " aspriel
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

The driver is being used by multiple vendors who develop the firmware
api independently. So far the firmware api as used by the driver has
not diverged (yet). This change adds framework for supporting multiple
firmware apis. The vendor-specific support code has to provide a number
of callback operations. Right now it is only attach and detach callbacks
so no real functionality as the api is still common. This code only
adds WCC variant anyway, which is selected for all devices right now.

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>
---
 .../broadcom/brcm80211/brcmfmac/Kconfig       |  16 ++
 .../broadcom/brcm80211/brcmfmac/Makefile      |   7 +
 .../broadcom/brcm80211/brcmfmac/bus.h         |   4 +
 .../broadcom/brcm80211/brcmfmac/core.c        |   9 +
 .../broadcom/brcm80211/brcmfmac/core.h        |   2 +
 .../broadcom/brcm80211/brcmfmac/fwvid.c       | 196 ++++++++++++++++++
 .../broadcom/brcm80211/brcmfmac/fwvid.h       |  46 ++++
 .../broadcom/brcm80211/brcmfmac/wcc/Makefile  |  12 ++
 .../broadcom/brcm80211/brcmfmac/wcc/core.c    |  27 +++
 .../broadcom/brcm80211/brcmfmac/wcc/module.c  |  26 +++
 .../broadcom/brcm80211/brcmfmac/wcc/vops.h    |  15 ++
 11 files changed, 360 insertions(+)
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
 create mode 100644
drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/Makefile
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/core.c
 create mode 100644
drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/vops.h

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
index 32794c1eca23..32c2f6e42a3e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
@@ -8,6 +8,22 @@ config BRCMFMAC
 	  interface support. If you choose to build a module, it'll be called
 	  brcmfmac.ko.

+config BRCMFMAC_VENDOR_MODULES
+	bool "Use vendor-specific modules"
+	depends on BRCMFMAC = m
+	help
+	  This option will build separate modules for the vendor-specific
+	  firmware support. If not selected the vendor-specific support
+	  will be build in brcmfmac.ko.
+
+config BRCMFMAC_VENDOR_WCC
+	bool "Broadcom WCC"
+	default y
+	depends on BRCMFMAC
+        help
+          This option will allow the driver to communicate with devices
+          shipped by Broadcom WCC division.
+
 config BRCMFMAC_PROTO_BCDC
 	bool

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
index 13c13504a6e8..08dbafdb6527 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
@@ -20,6 +20,7 @@ brcmfmac-objs += \
 		common.o \
 		core.o \
 		firmware.o \
+		fwvid.o \
 		feature.o \
 		btcoex.o \
 		vendor.o \
@@ -47,3 +48,9 @@ brcmfmac-$(CONFIG_OF) += \
 		of.o
 brcmfmac-$(CONFIG_DMI) += \
 		dmi.o
+
+ifeq ($(CONFIG_BRCMFMAC_VENDOR_MODULES),)
+brcmfmac-$(CONFIG_BRCMFMAC_VENDOR_WCC) += wcc/core.o
+else
+obj-$(CONFIG_BRCMFMAC_VENDOR_WCC) += wcc/
+endif
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 2008fde3ff4e..a2759171fcc9 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -142,7 +142,9 @@ struct brcmf_bus_stats {
  * @fwvid: firmware vendor-support identifier of the device.
  * @always_use_fws_queue: bus wants use queue also when fwsignal is inactive.
  * @wowl_supported: is wowl supported by bus driver.
+ * @ops: callbacks for this bus instance.
  * @msgbuf: msgbuf protocol parameters provided by bus layer.
+ * @list: member used to add this bus instance to linked list.
  */
 struct brcmf_bus {
 	union {
@@ -164,6 +166,8 @@ struct brcmf_bus {

 	const struct brcmf_bus_ops *ops;
 	struct brcmf_bus_msgbuf *msgbuf;
+
+	struct list_head list;
 };

 /*
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 87aef211b35f..9a77b100abbb 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -18,6 +18,7 @@

 #include "core.h"
 #include "bus.h"
+#include "fwvid.h"
 #include "debug.h"
 #include "fwil_types.h"
 #include "p2p.h"
@@ -1335,6 +1336,12 @@ int brcmf_attach(struct device *dev)
 	/* Link to bus module */
 	drvr->hdrlen = 0;

+	ret = brcmf_fwvid_attach(drvr);
+	if (ret != 0) {
+		bphy_err(drvr, "brcmf_fwvid_attach failed\n");
+		goto fail;
+	}
+
 	/* Attach and link in the protocol */
 	ret = brcmf_proto_attach(drvr);
 	if (ret != 0) {
@@ -1445,6 +1452,8 @@ void brcmf_detach(struct device *dev)
 		brcmf_cfg80211_detach(drvr->config);
 		drvr->config = NULL;
 	}
+
+	brcmf_fwvid_detach(drvr);
 }

 void brcmf_free(struct device *dev)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
index 340346c122d3..5d627b8dbb50 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
@@ -136,6 +136,8 @@ struct brcmf_pub {
 	struct work_struct bus_reset;

 	u8 clmver[BRCMF_DCMD_SMLEN];
+	const struct brcmf_fwvid_ops *vops;
+	void *vdata;
 };

 /* forward declarations */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
new file mode 100644
index 000000000000..654a31caa643
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -0,0 +1,196 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#include <linux/errno.h>
+#include <linux/export.h>
+#include <linux/module.h>
+#include <linux/kmod.h>
+#include <linux/list.h>
+#include <linux/completion.h>
+#include <linux/mutex.h>
+#include <linux/printk.h>
+#include <linux/jiffies.h>
+#include <linux/workqueue.h>
+
+#include "core.h"
+#include "bus.h"
+#include "debug.h"
+#include "fwvid.h"
+
+#include "wcc/vops.h"
+
+struct brcmf_fwvid_entry {
+	bool enabled;
+	const char *name;
+	const struct brcmf_fwvid_ops *vops;
+	struct list_head drvr_list;
+#ifdef CONFIG_BRCMFMAC_VENDOR_MODULES
+	struct module *vmod;
+	struct completion reg_done;
+#endif
+};
+
+static DEFINE_MUTEX(fwvid_list_lock);
+
+#ifdef CONFIG_BRCMFMAC_VENDOR_MODULES
+#define FWVID_ENTRY_INIT(_vid, _name) \
+	[BRCMF_FWVENDOR_ ## _vid] = { \
+		.enabled = IS_ENABLED(CONFIG_BRCMFMAC_VENDOR_ ## _vid), \
+		.name = #_name, \
+		.reg_done = COMPLETION_INITIALIZER(fwvid_list[BRCMF_FWVENDOR_ ##
_vid].reg_done), \
+		.drvr_list = LIST_HEAD_INIT(fwvid_list[BRCMF_FWVENDOR_ ## _vid].drvr_list), \
+	}
+#else
+#define FWVID_ENTRY_INIT(_vid, _name) \
+	[BRCMF_FWVENDOR_ ## _vid] = { \
+		.enabled = IS_ENABLED(CONFIG_BRCMFMAC_VENDOR_ ## _vid), \
+		.name = #_name, \
+		.drvr_list = LIST_HEAD_INIT(fwvid_list[BRCMF_FWVENDOR_ ## _vid].drvr_list), \
+		.vops = _vid ## _VOPS \
+	}
+#endif /* CONFIG_BRCMFMAC_VENDOR_MODULES */
+
+static struct brcmf_fwvid_entry fwvid_list[BRCMF_FWVENDOR_NUM] = {
+	FWVID_ENTRY_INIT(WCC, wcc),
+};
+
+#ifdef CONFIG_BRCMFMAC_VENDOR_MODULES
+static int brcmf_fwvid_request_module(enum brcmf_fwvendor fwvid)
+{
+	int ret;
+
+	if (!fwvid_list[fwvid].vmod) {
+		struct completion *reg_done = &fwvid_list[fwvid].reg_done;
+
+		mutex_unlock(&fwvid_list_lock);
+
+		ret = request_module("brcmfmac-%s", fwvid_list[fwvid].name);
+		if (ret)
+			goto fail;
+
+		ret = wait_for_completion_interruptible(reg_done);
+		if (ret)
+			goto fail;
+
+		mutex_lock(&fwvid_list_lock);
+	}
+	return 0;
+
+fail:
+	brcmf_err("mod=%s: failed %d\n", fwvid_list[fwvid].name, ret);
+	return ret;
+}
+
+int brcmf_fwvid_register_vendor(enum brcmf_fwvendor fwvid, struct module *vmod,
+				const struct brcmf_fwvid_ops *vops)
+{
+	if (fwvid >= BRCMF_FWVENDOR_NUM)
+		return -ERANGE;
+
+	if (WARN_ON(!vmod) || WARN_ON(!vops) ||
+	    WARN_ON(!vops->attach) || WARN_ON(!vops->detach))
+		return -EINVAL;
+
+	if (WARN_ON(fwvid_list[fwvid].vmod))
+		return -EEXIST;
+
+	brcmf_dbg(TRACE, "mod=%s: enter\n", fwvid_list[fwvid].name);
+
+	mutex_lock(&fwvid_list_lock);
+
+	fwvid_list[fwvid].vmod = vmod;
+	fwvid_list[fwvid].vops = vops;
+
+	mutex_unlock(&fwvid_list_lock);
+
+	complete_all(&fwvid_list[fwvid].reg_done);
+
+	return 0;
+}
+EXPORT_SYMBOL(brcmf_fwvid_register_vendor);
+
+int brcmf_fwvid_unregister_vendor(enum brcmf_fwvendor fwvid, struct
module *mod)
+{
+	struct brcmf_bus *bus, *tmp;
+
+	if (fwvid >= BRCMF_FWVENDOR_NUM)
+		return -ERANGE;
+
+	if (WARN_ON(fwvid_list[fwvid].vmod != mod))
+		return -ENOENT;
+
+	mutex_lock(&fwvid_list_lock);
+
+	list_for_each_entry_safe(bus, tmp, &fwvid_list[fwvid].drvr_list, list) {
+		mutex_unlock(&fwvid_list_lock);
+
+		brcmf_dbg(INFO, "mod=%s: removing %s\n", fwvid_list[fwvid].name,
+			  dev_name(bus->dev));
+		brcmf_bus_remove(bus);
+
+		mutex_lock(&fwvid_list_lock);
+	}
+
+	fwvid_list[fwvid].vmod = NULL;
+	fwvid_list[fwvid].vops = NULL;
+	reinit_completion(&fwvid_list[fwvid].reg_done);
+
+	brcmf_dbg(TRACE, "mod=%s: exit\n", fwvid_list[fwvid].name);
+	mutex_unlock(&fwvid_list_lock);
+
+	return 0;
+}
+EXPORT_SYMBOL(brcmf_fwvid_unregister_vendor);
+#else
+static inline int brcmf_fwvid_request_module(enum brcmf_fwvendor fwvid)
+{
+	return 0;
+}
+#endif
+
+int brcmf_fwvid_attach_ops(struct brcmf_pub *drvr)
+{
+	enum brcmf_fwvendor fwvid = drvr->bus_if->fwvid;
+	int ret;
+
+	if (fwvid >= ARRAY_SIZE(fwvid_list))
+		return -ERANGE;
+
+	if (!fwvid_list[fwvid].enabled)
+		return -EPROTONOSUPPORT;
+
+	brcmf_dbg(TRACE, "mod=%s: enter: dev %s\n", fwvid_list[fwvid].name,
+		  dev_name(drvr->bus_if->dev));
+
+	mutex_lock(&fwvid_list_lock);
+
+	ret = brcmf_fwvid_request_module(fwvid);
+	if (ret)
+		return ret;
+
+	drvr->vops = fwvid_list[fwvid].vops;
+	list_add(&drvr->bus_if->list, &fwvid_list[fwvid].drvr_list);
+
+	mutex_unlock(&fwvid_list_lock);
+
+	return ret;
+}
+
+void brcmf_fwvid_detach_ops(struct brcmf_pub *drvr)
+{
+	enum brcmf_fwvendor fwvid = drvr->bus_if->fwvid;
+
+	if (fwvid >= ARRAY_SIZE(fwvid_list))
+		return;
+
+	brcmf_dbg(TRACE, "mod=%s: enter: dev %s\n", fwvid_list[fwvid].name,
+		  dev_name(drvr->bus_if->dev));
+
+	mutex_lock(&fwvid_list_lock);
+
+	drvr->vops = NULL;
+	list_del(&drvr->bus_if->list);
+
+	mutex_unlock(&fwvid_list_lock);
+}
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
new file mode 100644
index 000000000000..cc79df8cc428
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef FWVID_H_
+#define FWVID_H_
+
+#include "firmware.h"
+
+struct brcmf_pub;
+
+struct brcmf_fwvid_ops {
+	int (*attach)(struct brcmf_pub *drvr);
+	void (*detach)(struct brcmf_pub *drvr);
+};
+
+/* exported functions */
+int brcmf_fwvid_register_vendor(enum brcmf_fwvendor fwvid, struct module *mod,
+				const struct brcmf_fwvid_ops *ops);
+int brcmf_fwvid_unregister_vendor(enum brcmf_fwvendor fwvid, struct
module *mod);
+
+/* core driver functions */
+int brcmf_fwvid_attach_ops(struct brcmf_pub *drvr);
+void brcmf_fwvid_detach_ops(struct brcmf_pub *drvr);
+
+static inline int brcmf_fwvid_attach(struct brcmf_pub *drvr)
+{
+	int ret;
+
+	ret = brcmf_fwvid_attach_ops(drvr);
+	if (ret)
+		return ret;
+
+	return drvr->vops->attach(drvr);
+}
+
+static inline void brcmf_fwvid_detach(struct brcmf_pub *drvr)
+{
+	if (!drvr->vops)
+		return;
+
+	drvr->vops->detach(drvr);
+	brcmf_fwvid_detach_ops(drvr);
+}
+
+#endif /* FWVID_H_ */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/Makefile
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/Makefile
new file mode 100644
index 000000000000..7f455a19a2b1
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/Makefile
@@ -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-wcc.o
+brcmfmac-wcc-objs += \
+		core.o module.o
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/core.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/core.c
new file mode 100644
index 000000000000..02de99818efa
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/core.c
@@ -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_wcc_attach(struct brcmf_pub *drvr)
+{
+	pr_err("%s: executing\n", __func__);
+	return 0;
+}
+
+static void brcmf_wcc_detach(struct brcmf_pub *drvr)
+{
+	pr_err("%s: executing\n", __func__);
+}
+
+const struct brcmf_fwvid_ops brcmf_wcc_ops = {
+	.attach = brcmf_wcc_attach,
+	.detach = brcmf_wcc_detach,
+};
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
new file mode 100644
index 000000000000..23e3a4557880
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
@@ -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_wcc_init(void)
+{
+	return brcmf_fwvid_register_vendor(BRCMF_FWVENDOR_WCC, THIS_MODULE,
+					   &brcmf_wcc_ops);
+}
+
+static void __exit brcmf_wcc_exit(void)
+{
+	brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_WCC, THIS_MODULE);
+}
+
+MODULE_LICENSE("Dual BSD/GPL");
+
+module_init(brcmf_wcc_init);
+module_exit(brcmf_wcc_exit);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/vops.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/vops.h
new file mode 100644
index 000000000000..a836954334e5
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/vops.h
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef _BRCMFMAC_WCC_VOPS_H
+#define _BRCMFMAC_WCC_VOPS_H
+
+#ifdef CONFIG_BRCMFMAC_VENDOR_WCC
+extern const struct brcmf_fwvid_ops brcmf_wcc_ops;
+#define WCC_VOPS	(&brcmf_wcc_ops)
+#else
+#define WCC_VOPS	(NULL)
+#endif /* CONFIG_BRCMFMAC_VENDOR_WCC */
+
+#endif /* _BRCMFMAC_WCC_VOPS_H */
-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 4/7] brcmfmac: add support for Cypress firmware api
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
  2022-06-13  9:19 ` [PATCH 1/7] brcmfmac: add function to unbind device to bus layer api aspriel
  2022-06-13  9:19 ` [PATCH 2/7] brcmfmac: add firmware vendor info in driver data aspriel
@ 2022-06-13  9:19 ` aspriel
  2022-07-28  9:38   ` Kalle Valo
  2022-06-13  9:19 ` [PATCH 3/7] brcmfmac: add support for vendor-specific " aspriel
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

Cypress uses the brcmfmac driver and releases firmware which will
likely diverge over time. 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>
---
 .../broadcom/brcm80211/brcmfmac/Kconfig       |  7 +++
 .../broadcom/brcm80211/brcmfmac/Makefile      |  2 +
 .../broadcom/brcm80211/brcmfmac/bcmsdh.c      | 46 +++++++++----------
 .../broadcom/brcm80211/brcmfmac/bus.h         |  1 +
 .../broadcom/brcm80211/brcmfmac/cyw/Makefile  | 12 +++++
 .../broadcom/brcm80211/brcmfmac/cyw/core.c    | 27 +++++++++++
 .../broadcom/brcm80211/brcmfmac/cyw/module.c  | 26 +++++++++++
 .../broadcom/brcm80211/brcmfmac/cyw/vops.h    | 15 ++++++
 .../broadcom/brcm80211/brcmfmac/fwvid.c       |  2 +
 9 files changed, 115 insertions(+), 23 deletions(-)
 create mode 100644
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/Makefile
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c
 create mode 100644
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
index 32c2f6e42a3e..60b6e218306b 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
@@ -24,6 +24,13 @@ config BRCMFMAC_VENDOR_WCC
           This option will allow the driver to communicate with devices
           shipped by Broadcom WCC division.

+config BRCMFMAC_VENDOR_CYW
+	bool "Cypress Wireless"
+	depends on BRCMFMAC
+	help
+          This option will allow the driver to communicate with devices
+          shipped by Cypress.
+
 config BRCMFMAC_PROTO_BCDC
 	bool

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
index 08dbafdb6527..1c481477c28a 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
@@ -51,6 +51,8 @@ brcmfmac-$(CONFIG_DMI) += \

 ifeq ($(CONFIG_BRCMFMAC_VENDOR_MODULES),)
 brcmfmac-$(CONFIG_BRCMFMAC_VENDOR_WCC) += wcc/core.o
+brcmfmac-$(CONFIG_BRCMFMAC_VENDOR_CYW) += cyw/core.o
 else
 obj-$(CONFIG_BRCMFMAC_VENDOR_WCC) += wcc/
+obj-$(CONFIG_BRCMFMAC_VENDOR_CYW) += cyw/
 endif
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index 5ec56567dab6..16e49291ffcc 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
@@ -967,35 +967,35 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
 	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_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_43752, CYW),
+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359, CYW),
 	{ /* end: all zeroes */ }
 };
 MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index a2759171fcc9..e114c65a75d7 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -25,6 +25,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
index 000000000000..5e1fddaff79e
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/Makefile
@@ -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
index 000000000000..b75652ba9359
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c
@@ -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
index 000000000000..34294724a1f8
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
@@ -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
index 000000000000..cc158b24f782
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef _BRCMFMAC_CYW_VOPS_H
+#define _BRCMFMAC_CYW_VOPS_H
+
+#ifdef CONFIG_BRCMFMAC_VENDOR_CYW
+extern const struct brcmf_fwvid_ops brcmf_cyw_ops;
+#define CYW_VOPS	(&brcmf_cyw_ops)
+#else
+#define CYW_VOPS	(NULL)
+#endif /* CONFIG_BRCMFMAC_VENDOR_CYW */
+
+#endif /* _BRCMFMAC_CYW_VOPS_H */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
index 654a31caa643..e6b8bbb99c88 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -19,6 +19,7 @@
 #include "fwvid.h"

 #include "wcc/vops.h"
+#include "cyw/vops.h"

 struct brcmf_fwvid_entry {
 	bool enabled;
@@ -53,6 +54,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),
 };

 #ifdef CONFIG_BRCMFMAC_VENDOR_MODULES
-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 6/7] brcmfmac: add vendor name in revinfo debugfs file
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
                   ` (4 preceding siblings ...)
  2022-06-13  9:19 ` [PATCH 5/7] brcmfmac: add support Broadcom BCA " aspriel
@ 2022-06-13  9:19 ` aspriel
  2022-06-13  9:19 ` [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace aspriel
  6 siblings, 0 replies; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

Upon probe the driver determines the vendor supporting the device.
Expose this information in the revinfo debugfs file.

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>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 3 ++-
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c | 5 +++++
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h | 1 +
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 9a77b100abbb..c2b3525f7103 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -1139,7 +1139,8 @@ static int brcmf_revinfo_read(struct seq_file
*s, void *data)
 	seq_printf(s, "vendorid: 0x%04x\n", ri->vendorid);
 	seq_printf(s, "deviceid: 0x%04x\n", ri->deviceid);
 	seq_printf(s, "radiorev: %s\n", brcmu_dotrev_str(ri->radiorev, drev));
-	seq_printf(s, "chip: %s\n", ri->chipname);
+	seq_printf(s, "chip: %s (%s)\n", ri->chipname,
+		   brcmf_fwvid_vendor_name(bus_if->drvr));
 	seq_printf(s, "chippkg: %u\n", ri->chippkg);
 	seq_printf(s, "corerev: %u\n", ri->corerev);
 	seq_printf(s, "boardid: 0x%04x\n", ri->boardid);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
index 919c60172e08..d0ba2aba093b 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -198,3 +198,8 @@ void brcmf_fwvid_detach_ops(struct brcmf_pub *drvr)

 	mutex_unlock(&fwvid_list_lock);
 }
+
+const char *brcmf_fwvid_vendor_name(struct brcmf_pub *drvr)
+{
+	return fwvid_list[drvr->bus_if->fwvid].name;
+}
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
index cc79df8cc428..8344d473a549 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h
@@ -22,6 +22,7 @@ int brcmf_fwvid_unregister_vendor(enum
brcmf_fwvendor fwvid, struct module *mod)
 /* core driver functions */
 int brcmf_fwvid_attach_ops(struct brcmf_pub *drvr);
 void brcmf_fwvid_detach_ops(struct brcmf_pub *drvr);
+const char *brcmf_fwvid_vendor_name(struct brcmf_pub *drvr);

 static inline int brcmf_fwvid_attach(struct brcmf_pub *drvr)
 {
-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 5/7] brcmfmac: add support Broadcom BCA firmware api
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
                   ` (3 preceding siblings ...)
  2022-06-13  9:19 ` [PATCH 3/7] brcmfmac: add support for vendor-specific " aspriel
@ 2022-06-13  9:19 ` aspriel
  2022-07-28  9:38   ` Kalle Valo
  2022-06-13  9:19 ` [PATCH 6/7] brcmfmac: add vendor name in revinfo debugfs file aspriel
  2022-06-13  9:19 ` [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace aspriel
  6 siblings, 1 reply; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

Broadcom BCA division develops its own firmware api and as such will
likely diverge over time. 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>
---
 .../broadcom/brcm80211/brcmfmac/Kconfig       |  7 +++
 .../broadcom/brcm80211/brcmfmac/Makefile      |  2 +
 .../broadcom/brcm80211/brcmfmac/bca/Makefile  | 12 +++++
 .../broadcom/brcm80211/brcmfmac/bca/core.c    | 27 ++++++++++
 .../broadcom/brcm80211/brcmfmac/bca/module.c  | 26 ++++++++++
 .../broadcom/brcm80211/brcmfmac/bca/vops.h    | 15 ++++++
 .../broadcom/brcm80211/brcmfmac/bus.h         |  1 +
 .../broadcom/brcm80211/brcmfmac/fwvid.c       |  2 +
 .../broadcom/brcm80211/brcmfmac/pcie.c        | 52 +++++++++----------
 9 files changed, 118 insertions(+), 26 deletions(-)
 create mode 100644
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/Makefile
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c
 create mode 100644
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
 create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
index 60b6e218306b..19c7d88766bb 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
@@ -31,6 +31,13 @@ config BRCMFMAC_VENDOR_CYW
           This option will allow the driver to communicate with devices
           shipped by Cypress.

+config BRCMFMAC_VENDOR_BCA
+	bool "Broadcom BCA"
+	depends on BRCMFMAC
+	help
+	  This option will allow the driver to communicate with devices
+	  shipped by Broadcom BCA division.
+
 config BRCMFMAC_PROTO_BCDC
 	bool

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
index 1c481477c28a..a403c5cde618 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
@@ -52,7 +52,9 @@ brcmfmac-$(CONFIG_DMI) += \
 ifeq ($(CONFIG_BRCMFMAC_VENDOR_MODULES),)
 brcmfmac-$(CONFIG_BRCMFMAC_VENDOR_WCC) += wcc/core.o
 brcmfmac-$(CONFIG_BRCMFMAC_VENDOR_CYW) += cyw/core.o
+brcmfmac-$(CONFIG_BRCMFMAC_VENDOR_BCA) += bca/core.o
 else
 obj-$(CONFIG_BRCMFMAC_VENDOR_WCC) += wcc/
 obj-$(CONFIG_BRCMFMAC_VENDOR_CYW) += cyw/
+obj-$(CONFIG_BRCMFMAC_VENDOR_BCA) += bca/
 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
index 000000000000..46098705e236
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/Makefile
@@ -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
index 000000000000..ac3a36fa3640
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c
@@ -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
index 000000000000..790116a735c7
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
@@ -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
index 000000000000..1df4c5f9b4f6
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef _BRCMFMAC_BCA_VOPS_H
+#define _BRCMFMAC_BCA_VOPS_H
+
+#ifdef CONFIG_BRCMFMAC_VENDOR_BCA
+extern const struct brcmf_fwvid_ops brcmf_bca_ops;
+#define BCA_VOPS	(&brcmf_bca_ops)
+#else
+#define BCA_VOPS	(NULL)
+#endif /* CONFIG_BRCMFMAC_VENDOR_BCA */
+
+#endif /* _BRCMFMAC_BCA_VOPS_H */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index e114c65a75d7..c4a6dd2ec617 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -26,6 +26,7 @@
 enum brcmf_fwvendor {
 	BRCMF_FWVENDOR_WCC,
 	BRCMF_FWVENDOR_CYW,
+	BRCMF_FWVENDOR_BCA,
 	/* keep last */
 	BRCMF_FWVENDOR_NUM,
 	BRCMF_FWVENDOR_INVALID
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
index e6b8bbb99c88..919c60172e08 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -20,6 +20,7 @@

 #include "wcc/vops.h"
 #include "cyw/vops.h"
+#include "bca/vops.h"

 struct brcmf_fwvid_entry {
 	bool enabled;
@@ -55,6 +56,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),
 };

 #ifdef CONFIG_BRCMFMAC_VENDOR_MODULES
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 0599dad96018..68fd191aaae1 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -2077,44 +2077,44 @@ 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_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),
 	{ /* end: all zeroes */ }
 };

-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace
       [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
                   ` (5 preceding siblings ...)
  2022-06-13  9:19 ` [PATCH 6/7] brcmfmac: add vendor name in revinfo debugfs file aspriel
@ 2022-06-13  9:19 ` aspriel
  2022-07-28  9:39   ` Kalle Valo
  6 siblings, 1 reply; 16+ messages in thread
From: aspriel @ 2022-06-13  9:19 UTC (permalink / raw)
  To: Kalle Valo, arend.vanspriel; +Cc: linux-wireless

Instead of using EXPORT_SYMBOL() use namespace variant and only if
build vendor-specific code as separate module.

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>
---
 .../net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c   | 1 +
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h     | 6 ++++++
 .../net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c   | 1 +
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c    | 4 ++--
 .../net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c   | 1 +
 5 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
index 790116a735c7..d55f3271d619 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
@@ -21,6 +21,7 @@ static void __exit brcmf_bca_exit(void)
 }

 MODULE_LICENSE("Dual BSD/GPL");
+MODULE_IMPORT_NS(BRCMFMAC);

 module_init(brcmf_bca_init);
 module_exit(brcmf_bca_exit);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
index 5d627b8dbb50..8cafe59c089d 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
@@ -13,6 +13,12 @@
 #include <net/cfg80211.h>
 #include "fweh.h"

+#if IS_ENABLED(CONFIG_BRCMFMAC_VENDOR_MODULES)
+#define BRCMF_EXPORT_SYMBOL_GPL(__sym)	EXPORT_SYMBOL_NS_GPL(__sym, BRCMFMAC)
+#else
+#define BRCMF_EXPORT_SYMBOL(__sym)
+#endif
+
 #define TOE_TX_CSUM_OL		0x00000001
 #define TOE_RX_CSUM_OL		0x00000002

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
index 34294724a1f8..f82fbbe3ecef 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
@@ -21,6 +21,7 @@ static void __exit brcmf_cyw_exit(void)
 }

 MODULE_LICENSE("Dual BSD/GPL");
+MODULE_IMPORT_NS(BRCMFMAC);

 module_init(brcmf_cyw_init);
 module_exit(brcmf_cyw_exit);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
index d0ba2aba093b..be72203f4e0b 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -112,7 +112,7 @@ int brcmf_fwvid_register_vendor(enum
brcmf_fwvendor fwvid, struct module *vmod,

 	return 0;
 }
-EXPORT_SYMBOL(brcmf_fwvid_register_vendor);
+BRCMF_EXPORT_SYMBOL_GPL(brcmf_fwvid_register_vendor);

 int brcmf_fwvid_unregister_vendor(enum brcmf_fwvendor fwvid, struct
module *mod)
 {
@@ -145,7 +145,7 @@ int brcmf_fwvid_unregister_vendor(enum
brcmf_fwvendor fwvid, struct module *mod)

 	return 0;
 }
-EXPORT_SYMBOL(brcmf_fwvid_unregister_vendor);
+BRCMF_EXPORT_SYMBOL_GPL(brcmf_fwvid_unregister_vendor);
 #else
 static inline int brcmf_fwvid_request_module(enum brcmf_fwvendor fwvid)
 {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
index 23e3a4557880..02918d434556 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
@@ -21,6 +21,7 @@ static void __exit brcmf_wcc_exit(void)
 }

 MODULE_LICENSE("Dual BSD/GPL");
+MODULE_IMPORT_NS(BRCMFMAC);

 module_init(brcmf_wcc_init);
 module_exit(brcmf_wcc_exit);
-- 
2.32.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/7] brcmfmac: add firmware vendor info in driver data
  2022-06-13  9:19 ` [PATCH 2/7] brcmfmac: add firmware vendor info in driver data aspriel
@ 2022-07-28  9:31   ` Kalle Valo
  0 siblings, 0 replies; 16+ messages in thread
From: Kalle Valo @ 2022-07-28  9:31 UTC (permalink / raw)
  To: aspriel; +Cc: arend.vanspriel, linux-wireless

aspriel@gmail.com writes:

> In order to determine the vendor that released a firmware image for
> a specific device, the device table now sets the vendor identifier
> and it is stored in struct brcmf_bus::fwvid during probe.
>
> 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>

The patchwork page for this patch looks odd, but didn't investigate in
detail. Never seen that kind of parsing problems before:

https://patchwork.kernel.org/project/linux-wireless/patch/CAJ65rDwH9SYhsTKM_4c6e0EN6qfp16kGVsVtSs0d+TNou=DF5g@mail.gmail.com/

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/7] brcmfmac: add support for vendor-specific firmware api
  2022-06-13  9:19 ` [PATCH 3/7] brcmfmac: add support for vendor-specific " aspriel
@ 2022-07-28  9:36   ` Kalle Valo
  2022-07-29  9:32     ` Arend Van Spriel
  0 siblings, 1 reply; 16+ messages in thread
From: Kalle Valo @ 2022-07-28  9:36 UTC (permalink / raw)
  To: aspriel; +Cc: arend.vanspriel, linux-wireless

aspriel@gmail.com writes:

> The driver is being used by multiple vendors who develop the firmware
> api independently. So far the firmware api as used by the driver has
> not diverged (yet). This change adds framework for supporting multiple
> firmware apis. The vendor-specific support code has to provide a number
> of callback operations. Right now it is only attach and detach callbacks
> so no real functionality as the api is still common. This code only
> adds WCC variant anyway, which is selected for all devices right now.
>
> 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>

[...]

> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
> @@ -8,6 +8,22 @@ config BRCMFMAC
>  	  interface support. If you choose to build a module, it'll be called
>  	  brcmfmac.ko.
>
> +config BRCMFMAC_VENDOR_MODULES
> +	bool "Use vendor-specific modules"
> +	depends on BRCMFMAC = m
> +	help
> +	  This option will build separate modules for the vendor-specific
> +	  firmware support. If not selected the vendor-specific support
> +	  will be build in brcmfmac.ko.
> +
> +config BRCMFMAC_VENDOR_WCC
> +	bool "Broadcom WCC"
> +	default y
> +	depends on BRCMFMAC
> +        help
> +          This option will allow the driver to communicate with devices
> +          shipped by Broadcom WCC division.
> +

I'm not really a fan of these Kconfig options, I would rather have them
always enabled. Why do we need these options, what would be the use case
when user disables these?

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 4/7] brcmfmac: add support for Cypress firmware api
  2022-06-13  9:19 ` [PATCH 4/7] brcmfmac: add support for Cypress firmware api aspriel
@ 2022-07-28  9:38   ` Kalle Valo
  0 siblings, 0 replies; 16+ messages in thread
From: Kalle Valo @ 2022-07-28  9:38 UTC (permalink / raw)
  To: aspriel; +Cc: arend.vanspriel, linux-wireless

aspriel@gmail.com writes:

> Cypress uses the brcmfmac driver and releases firmware which will
> likely diverge over time. 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>

[...]

> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
> @@ -24,6 +24,13 @@ config BRCMFMAC_VENDOR_WCC
>            This option will allow the driver to communicate with devices
>            shipped by Broadcom WCC division.
>
> +config BRCMFMAC_VENDOR_CYW
> +	bool "Cypress Wireless"
> +	depends on BRCMFMAC
> +	help
> +          This option will allow the driver to communicate with devices
> +          shipped by Cypress.
> +

Same comment here as in patch 3.

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 5/7] brcmfmac: add support Broadcom BCA firmware api
  2022-06-13  9:19 ` [PATCH 5/7] brcmfmac: add support Broadcom BCA " aspriel
@ 2022-07-28  9:38   ` Kalle Valo
  0 siblings, 0 replies; 16+ messages in thread
From: Kalle Valo @ 2022-07-28  9:38 UTC (permalink / raw)
  To: aspriel; +Cc: arend.vanspriel, linux-wireless

aspriel@gmail.com writes:

> Broadcom BCA division develops its own firmware api and as such will
> likely diverge over time. 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>

[...]

> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
> @@ -31,6 +31,13 @@ config BRCMFMAC_VENDOR_CYW
>            This option will allow the driver to communicate with devices
>            shipped by Cypress.
>
> +config BRCMFMAC_VENDOR_BCA
> +	bool "Broadcom BCA"
> +	depends on BRCMFMAC
> +	help
> +	  This option will allow the driver to communicate with devices
> +	  shipped by Broadcom BCA division.

Same comment here as in patch 3.

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace
  2022-06-13  9:19 ` [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace aspriel
@ 2022-07-28  9:39   ` Kalle Valo
  2022-07-29  9:38     ` Arend Van Spriel
  0 siblings, 1 reply; 16+ messages in thread
From: Kalle Valo @ 2022-07-28  9:39 UTC (permalink / raw)
  To: aspriel; +Cc: arend.vanspriel, linux-wireless

aspriel@gmail.com writes:

> Instead of using EXPORT_SYMBOL() use namespace variant and only if
> build vendor-specific code as separate module.

The commit log should always answer to the question "why?".

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/7] brcmfmac: add support for vendor-specific firmware api
  2022-07-28  9:36   ` Kalle Valo
@ 2022-07-29  9:32     ` Arend Van Spriel
  2022-10-19 11:58       ` Arend Van Spriel
  0 siblings, 1 reply; 16+ messages in thread
From: Arend Van Spriel @ 2022-07-29  9:32 UTC (permalink / raw)
  To: Kalle Valo; +Cc: arend.vanspriel, linux-wireless

On 7/28/2022 11:36 AM, Kalle Valo wrote:
> aspriel@gmail.com writes:
> 
>> The driver is being used by multiple vendors who develop the firmware
>> api independently. So far the firmware api as used by the driver has
>> not diverged (yet). This change adds framework for supporting multiple
>> firmware apis. The vendor-specific support code has to provide a number
>> of callback operations. Right now it is only attach and detach callbacks
>> so no real functionality as the api is still common. This code only
>> adds WCC variant anyway, which is selected for all devices right now.
>>
>> 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>
> 
> [...]
> 
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
>> @@ -8,6 +8,22 @@ config BRCMFMAC
>>   	  interface support. If you choose to build a module, it'll be called
>>   	  brcmfmac.ko.
>>
>> +config BRCMFMAC_VENDOR_MODULES
>> +	bool "Use vendor-specific modules"
>> +	depends on BRCMFMAC = m
>> +	help
>> +	  This option will build separate modules for the vendor-specific
>> +	  firmware support. If not selected the vendor-specific support
>> +	  will be build in brcmfmac.ko.
>> +
>> +config BRCMFMAC_VENDOR_WCC
>> +	bool "Broadcom WCC"
>> +	default y
>> +	depends on BRCMFMAC
>> +        help
>> +          This option will allow the driver to communicate with devices
>> +          shipped by Broadcom WCC division.
>> +
> 
> I'm not really a fan of these Kconfig options, I would rather have them
> always enabled. Why do we need these options, what would be the use case
> when user disables these?

I assume with "always enabled" you mean "drop these options". Obviously 
I would prefer to keep them. The default will result in a single module 
with all vendor support built-in, but this allows people to trim down 
their configuration based on what they have. So the choices are:

1) single module with all vendor support built-in
2) single module with partial vendor support built-in (as needed)

    allows users to select vendor for their specific device not carrying
    stuff they don't need. If they have a Cypress/Infineon device they
    only need support for that.

3) separate vendor support modules loaded as needed during device probe

    build one or more vendor support modules and they are loaded into
    memory only when they are needed for the device detected.

Regards,
Arend

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace
  2022-07-28  9:39   ` Kalle Valo
@ 2022-07-29  9:38     ` Arend Van Spriel
  0 siblings, 0 replies; 16+ messages in thread
From: Arend Van Spriel @ 2022-07-29  9:38 UTC (permalink / raw)
  To: Kalle Valo; +Cc: arend.vanspriel, linux-wireless

On 7/28/2022 11:39 AM, Kalle Valo wrote:
> aspriel@gmail.com writes:
> 
>> Instead of using EXPORT_SYMBOL() use namespace variant and only if
>> build vendor-specific code as separate module.
> 
> The commit log should always answer to the question "why?".

Let me try:

Exported symbols are usable from any kernel module. Using the namespace 
variant requires the caller to explicitly import the symbols. This makes 
it more clear that these are only intended to be used by brcmfmac 
driver. When vendor-support is built-in there is no reason to export the
symbols at all.

If the above is acceptable I will use that when resending the patch series.

Regards,
Arend

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/7] brcmfmac: add support for vendor-specific firmware api
  2022-07-29  9:32     ` Arend Van Spriel
@ 2022-10-19 11:58       ` Arend Van Spriel
  2022-10-24 10:49         ` Kalle Valo
  0 siblings, 1 reply; 16+ messages in thread
From: Arend Van Spriel @ 2022-10-19 11:58 UTC (permalink / raw)
  To: Kalle Valo; +Cc: arend.vanspriel, linux-wireless

On 7/29/2022 11:32 AM, Arend Van Spriel wrote:
> On 7/28/2022 11:36 AM, Kalle Valo wrote:
>> aspriel@gmail.com writes:
>>
>>> The driver is being used by multiple vendors who develop the firmware
>>> api independently. So far the firmware api as used by the driver has
>>> not diverged (yet). This change adds framework for supporting multiple
>>> firmware apis. The vendor-specific support code has to provide a number
>>> of callback operations. Right now it is only attach and detach callbacks
>>> so no real functionality as the api is still common. This code only
>>> adds WCC variant anyway, which is selected for all devices right now.
>>>
>>> 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>
>>
>> [...]
>>
>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
>>> @@ -8,6 +8,22 @@ config BRCMFMAC
>>>         interface support. If you choose to build a module, it'll be 
>>> called
>>>         brcmfmac.ko.
>>>
>>> +config BRCMFMAC_VENDOR_MODULES
>>> +    bool "Use vendor-specific modules"
>>> +    depends on BRCMFMAC = m
>>> +    help
>>> +      This option will build separate modules for the vendor-specific
>>> +      firmware support. If not selected the vendor-specific support
>>> +      will be build in brcmfmac.ko.
>>> +
>>> +config BRCMFMAC_VENDOR_WCC
>>> +    bool "Broadcom WCC"
>>> +    default y
>>> +    depends on BRCMFMAC
>>> +        help
>>> +          This option will allow the driver to communicate with devices
>>> +          shipped by Broadcom WCC division.
>>> +
>>
>> I'm not really a fan of these Kconfig options, I would rather have them
>> always enabled. Why do we need these options, what would be the use case
>> when user disables these?
> 
> I assume with "always enabled" you mean "drop these options". Obviously 
> I would prefer to keep them. The default will result in a single module 
> with all vendor support built-in, but this allows people to trim down 
> their configuration based on what they have. So the choices are:
> 
> 1) single module with all vendor support built-in
> 2) single module with partial vendor support built-in (as needed)
> 
>     allows users to select vendor for their specific device not carrying
>     stuff they don't need. If they have a Cypress/Infineon device they
>     only need support for that.
> 
> 3) separate vendor support modules loaded as needed during device probe
> 
>     build all (or some) vendor support modules and they are loaded into
>     memory only when they are needed for the device detected.

Hi Kalle,

I wanted to give this series another try, but the conversation above 
never came to any conclusion/consensus. Maybe good to finish this before 
resending?

Regards,
Arend

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/7] brcmfmac: add support for vendor-specific firmware api
  2022-10-19 11:58       ` Arend Van Spriel
@ 2022-10-24 10:49         ` Kalle Valo
  0 siblings, 0 replies; 16+ messages in thread
From: Kalle Valo @ 2022-10-24 10:49 UTC (permalink / raw)
  To: Arend Van Spriel; +Cc: arend.vanspriel, linux-wireless

Arend Van Spriel <aspriel@gmail.com> writes:

> On 7/29/2022 11:32 AM, Arend Van Spriel wrote:
>> On 7/28/2022 11:36 AM, Kalle Valo wrote:
>>> aspriel@gmail.com writes:
>>>
>>>> The driver is being used by multiple vendors who develop the firmware
>>>> api independently. So far the firmware api as used by the driver has
>>>> not diverged (yet). This change adds framework for supporting multiple
>>>> firmware apis. The vendor-specific support code has to provide a number
>>>> of callback operations. Right now it is only attach and detach callbacks
>>>> so no real functionality as the api is still common. This code only
>>>> adds WCC variant anyway, which is selected for all devices right now.
>>>>
>>>> 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>
>>>
>>> [...]
>>>
>>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
>>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
>>>> @@ -8,6 +8,22 @@ config BRCMFMAC
>>>> . . . . . . .  interface support. If you choose to build a module, it'll be 
>>>> called
>>>> . . . . . . .  brcmfmac.ko.
>>>>
>>>> +config BRCMFMAC_VENDOR_MODULES
>>>> +. . .  bool "Use vendor-specific modules"
>>>> +. . .  depends on BRCMFMAC = m
>>>> +. . .  help
>>>> +. . . . .  This option will build separate modules for the vendor-specific
>>>> +. . . . .  firmware support. If not selected the vendor-specific support
>>>> +. . . . .  will be build in brcmfmac.ko.
>>>> +
>>>> +config BRCMFMAC_VENDOR_WCC
>>>> +. . .  bool "Broadcom WCC"
>>>> +. . .  default y
>>>> +. . .  depends on BRCMFMAC
>>>> +. . . . . . .  help
>>>> +. . . . . . . . .  This option will allow the driver to communicate with devices
>>>> +. . . . . . . . .  shipped by Broadcom WCC division.
>>>> +
>>>
>>> I'm not really a fan of these Kconfig options, I would rather have them
>>> always enabled. Why do we need these options, what would be the use case
>>> when user disables these?
>> 
>> I assume with "always enabled" you mean "drop these options". 

Yes, I meant dropping the options altogether.

>> Obviously I would prefer to keep them. The default will result in a
>> single module with all vendor support built-in, but this allows
>> people to trim down their configuration based on what they have. So
>> the choices are:
>> 
>> 1) single module with all vendor support built-in
>> 2) single module with partial vendor support built-in (as needed)
>> 
>>  . .  allows users to select vendor for their specific device not carrying
>>  . .  stuff they don't need. If they have a Cypress/Infineon device they
>>  . .  only need support for that.
>> 
>> 3) separate vendor support modules loaded as needed during device probe
>> 
>>  . .  build all (or some) vendor support modules and they are loaded into
>>  . .  memory only when they are needed for the device detected.
>
> I wanted to give this series another try, but the conversation above 
> never came to any conclusion/consensus. Maybe good to finish this before 
> resending?

Sorry, I was supposed to answer but it got piled up with other
unanswered emails.

So why I'm hesitant about these options is that Linus has multiple times
critised of adding unnecessary Kconfig options, and I agree with him.
Kconfig is quite a mess already and we need to be careful when adding
new options.

It's being a long time since I looked these patches so take this with
grain of salt, but is the memory savings from this really so
significant? From my point of view a faster way to get these to upstream
is to submit them without Kconfig options first. The options can be
added later if there's still strong need for them, and it's also easier
to show numbers to back it up.

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2022-10-24 10:49 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20220613091915.18884-1-arend.vanspriel@broadcom.com>
2022-06-13  9:19 ` [PATCH 1/7] brcmfmac: add function to unbind device to bus layer api aspriel
2022-06-13  9:19 ` [PATCH 2/7] brcmfmac: add firmware vendor info in driver data aspriel
2022-07-28  9:31   ` Kalle Valo
2022-06-13  9:19 ` [PATCH 4/7] brcmfmac: add support for Cypress firmware api aspriel
2022-07-28  9:38   ` Kalle Valo
2022-06-13  9:19 ` [PATCH 3/7] brcmfmac: add support for vendor-specific " aspriel
2022-07-28  9:36   ` Kalle Valo
2022-07-29  9:32     ` Arend Van Spriel
2022-10-19 11:58       ` Arend Van Spriel
2022-10-24 10:49         ` Kalle Valo
2022-06-13  9:19 ` [PATCH 5/7] brcmfmac: add support Broadcom BCA " aspriel
2022-07-28  9:38   ` Kalle Valo
2022-06-13  9:19 ` [PATCH 6/7] brcmfmac: add vendor name in revinfo debugfs file aspriel
2022-06-13  9:19 ` [PATCH 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace aspriel
2022-07-28  9:39   ` Kalle Valo
2022-07-29  9:38     ` Arend Van Spriel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.