* [PATCH V2 0/7] brcmfmac: support devices from multiple vendors
@ 2022-11-29 13:54 Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 1/7] brcmfmac: add function to unbind device to bus layer api Arend van Spriel
` (7 more replies)
0 siblings, 8 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo; +Cc: linux-wireless, Arend van Spriel
[-- Attachment #1: Type: text/plain, Size: 3651 bytes --]
Took my sweet time coming with this follow-up series, but here
it is. Hopefully, sending patches is working for me now.
The bcm43xx family of wifi chipsets found its way to different
groups inside and outside Broadcom. For the fullmac devices this
means that in those difference groups firmware is being developed
and the firmware api is bound to diverge. This series introduces
a design change to accomodate supporting multiple firmware api's.
The vender-specific support can be compiled in brcmfmac or
built as a separate module. Currently the vendor-specific support
does not have any real effect. At the momemt looking into SAE support
which appear to be different for Cypress devices so that might be a
first use-case.
The patches apply to the main branch of the wireless-next repository.
Arend van Spriel (7):
brcmfmac: add function to unbind device to bus layer api
brcmfmac: add firmware vendor info in driver data
brcmfmac: add support for vendor-specific firmware api
brcmfmac: add support for Cypress firmware api
brcmfmac: add support Broadcom BCA firmware api
brcmfmac: add vendor name in revinfo debugfs file
brcmfmac: introduce BRCMFMAC exported symbols namespace
.../broadcom/brcm80211/brcmfmac/Makefile | 11 +
.../broadcom/brcm80211/brcmfmac/bca/Makefile | 12 ++
.../broadcom/brcm80211/brcmfmac/bca/core.c | 27 +++
.../broadcom/brcm80211/brcmfmac/bca/module.c | 27 +++
.../broadcom/brcm80211/brcmfmac/bca/vops.h | 11 +
.../broadcom/brcm80211/brcmfmac/bcmsdh.c | 52 ++---
.../broadcom/brcm80211/brcmfmac/bus.h | 30 ++-
.../broadcom/brcm80211/brcmfmac/core.c | 12 +-
.../broadcom/brcm80211/brcmfmac/core.h | 8 +
.../broadcom/brcm80211/brcmfmac/cyw/Makefile | 12 ++
.../broadcom/brcm80211/brcmfmac/cyw/core.c | 27 +++
.../broadcom/brcm80211/brcmfmac/cyw/module.c | 27 +++
.../broadcom/brcm80211/brcmfmac/cyw/vops.h | 11 +
.../broadcom/brcm80211/brcmfmac/fwvid.c | 199 ++++++++++++++++++
.../broadcom/brcm80211/brcmfmac/fwvid.h | 47 +++++
.../broadcom/brcm80211/brcmfmac/pcie.c | 70 +++---
.../broadcom/brcm80211/brcmfmac/sdio.c | 12 +-
.../broadcom/brcm80211/brcmfmac/usb.c | 27 ++-
.../broadcom/brcm80211/brcmfmac/wcc/Makefile | 12 ++
.../broadcom/brcm80211/brcmfmac/wcc/core.c | 27 +++
.../broadcom/brcm80211/brcmfmac/wcc/module.c | 27 +++
.../broadcom/brcm80211/brcmfmac/wcc/vops.h | 11 +
22 files changed, 634 insertions(+), 65 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
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
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
--
2.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH V2 1/7] brcmfmac: add function to unbind device to bus layer api
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-12-08 14:44 ` [V2,1/7] wifi: " Kalle Valo
2022-11-29 13:54 ` [PATCH V2 2/7] brcmfmac: add firmware vendor info in driver info Arend van Spriel
` (6 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 3086 bytes --]
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 60f5645aead3..256456e38108 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -8,6 +8,7 @@
#include <linux/kernel.h>
#include <linux/firmware.h>
+#include <linux/device.h>
#include "debug.h"
/* IDs of the 6 default common rings of msgbuf protocol */
@@ -74,6 +75,7 @@ struct brcmf_bus_dcmd {
* @get_ramsize: obtain size of device memory.
* @get_memdump: obtain device memory dump in provided buffer.
* @get_blob: obtain a firmware blob.
+ * @remove: initiate unbind of the device.
*
* This structure provides an abstract interface towards the
* bus specific driver. For control messages to common driver
@@ -94,6 +96,7 @@ struct brcmf_bus_ops {
enum brcmf_blob_type type);
void (*debugfs_create)(struct device *dev);
int (*reset)(struct device *dev);
+ void (*remove)(struct device *dev);
};
@@ -257,6 +260,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 244ba48cc304..c949051c4bc4 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -4171,6 +4171,15 @@ static int brcmf_sdio_bus_reset(struct device *dev)
return 0;
}
+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,
@@ -4183,7 +4192,8 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
.get_memdump = brcmf_sdio_bus_get_memdump,
.get_blob = brcmf_sdio_get_blob,
.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.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 2/7] brcmfmac: add firmware vendor info in driver info
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 1/7] brcmfmac: add function to unbind device to bus layer api Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 3/7] brcmfmac: add support for vendor-specific firmware api Arend van Spriel
` (5 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 6891 bytes --]
In order to determine the vendor that released a firmware image for
a specific device, the device table now sets the vendor identifier
in driver info 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 d0daef674e72..fa919432b1c6 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
@@ -960,7 +960,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[] = {
@@ -1051,6 +1054,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 256456e38108..79fe0a49471c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -31,6 +31,13 @@
/* The maximum console interval value (5 mins) */
#define MAX_CONSOLE_INTERVAL (5 * 60)
+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 */
@@ -144,9 +151,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 {
@@ -163,6 +171,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 cf564adc612a..094bb84ed72f 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -2389,6 +2389,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);
@@ -2570,11 +2571,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 85e18fb9c497..246843aeb696 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
@@ -1240,7 +1240,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;
@@ -1265,6 +1266,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;
@@ -1423,7 +1425,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;
@@ -1511,14 +1513,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.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 3/7] brcmfmac: add support for vendor-specific firmware api
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 1/7] brcmfmac: add function to unbind device to bus layer api Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 2/7] brcmfmac: add firmware vendor info in driver info Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 4/7] brcmfmac: add support for Cypress " Arend van Spriel
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 13793 bytes --]
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.
The vendor-specific part will be built in a separate module when the
driver is configured to be built as a module through Kconfig, ie. when
CONFIG_BRCMFMAC=m.
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/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 | 190 ++++++++++++++++++
.../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 | 11 +
10 files changed, 334 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/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
index 13c13504a6e8..e7ceea7af13f 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),m)
+obj-m += wcc/
+else
+brcmfmac-$(CONFIG_BRCMFMAC) += wcc/core.o
+endif
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 79fe0a49471c..26be49ee8c90 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -155,7 +155,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 {
@@ -177,6 +179,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 d354f79fd0ac..584431150f7c 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"
@@ -1332,6 +1333,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) {
@@ -1443,6 +1450,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 2e71b5c2a975..a98b86982502 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
@@ -137,6 +137,8 @@ struct brcmf_pub {
u8 clmver[BRCMF_DCMD_SMLEN];
u8 sta_mac_idx;
+ 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..f5cbb09b1c83
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -0,0 +1,190 @@
+// 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 {
+ const char *name;
+ const struct brcmf_fwvid_ops *vops;
+ struct list_head drvr_list;
+#if IS_MODULE(CONFIG_BRCMFMAC)
+ struct module *vmod;
+ struct completion reg_done;
+#endif
+};
+
+static DEFINE_MUTEX(fwvid_list_lock);
+
+#if IS_MODULE(CONFIG_BRCMFMAC)
+#define FWVID_ENTRY_INIT(_vid, _name) \
+ [BRCMF_FWVENDOR_ ## _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] = { \
+ .name = #_name, \
+ .drvr_list = LIST_HEAD_INIT(fwvid_list[BRCMF_FWVENDOR_ ## _vid].drvr_list), \
+ .vops = _vid ## _VOPS \
+ }
+#endif /* IS_MODULE(CONFIG_BRCMFMAC) */
+
+static struct brcmf_fwvid_entry fwvid_list[BRCMF_FWVENDOR_NUM] = {
+ FWVID_ENTRY_INIT(WCC, wcc),
+};
+
+#if IS_MODULE(CONFIG_BRCMFMAC)
+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;
+
+ 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..6b3aec190023
--- /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..3aec44f80600
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/vops.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Copyright (c) 2022 Broadcom Corporation
+ */
+#ifndef _BRCMFMAC_WCC_VOPS_H
+#define _BRCMFMAC_WCC_VOPS_H
+
+extern const struct brcmf_fwvid_ops brcmf_wcc_ops;
+#define WCC_VOPS (&brcmf_wcc_ops)
+
+#endif /* _BRCMFMAC_WCC_VOPS_H */
--
2.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 4/7] brcmfmac: add support for Cypress firmware api
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
` (2 preceding siblings ...)
2022-11-29 13:54 ` [PATCH V2 3/7] brcmfmac: add support for vendor-specific firmware api Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 5/7] brcmfmac: add support Broadcom BCA " Arend van Spriel
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 8909 bytes --]
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>
---
.../broadcom/brcm80211/brcmfmac/Makefile | 2 +
.../broadcom/brcm80211/brcmfmac/bcmsdh.c | 48 +++++++++----------
.../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 | 11 +++++
.../broadcom/brcm80211/brcmfmac/fwvid.c | 2 +
8 files changed, 105 insertions(+), 24 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/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
index e7ceea7af13f..64fd77a378fd 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),m)
obj-m += wcc/
+obj-m += cyw/
else
brcmfmac-$(CONFIG_BRCMFMAC) += wcc/core.o
+brcmfmac-$(CONFIG_BRCMFMAC) += cyw/core.o
endif
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index fa919432b1c6..b7c918f241c9 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
@@ -959,36 +959,36 @@ 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_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);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 26be49ee8c90..72036fec9a8e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -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
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..870b5bead436
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/vops.h
@@ -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 */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
index f5cbb09b1c83..ee23eb1809c4 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 {
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)
--
2.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 5/7] brcmfmac: add support Broadcom BCA firmware api
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
` (3 preceding siblings ...)
2022-11-29 13:54 ` [PATCH V2 4/7] brcmfmac: add support for Cypress " Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 6/7] brcmfmac: add vendor name in revinfo debugfs file Arend van Spriel
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 9456 bytes --]
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>
---
.../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 | 11 ++++
.../broadcom/brcm80211/brcmfmac/bus.h | 1 +
.../broadcom/brcm80211/brcmfmac/fwvid.c | 2 +
.../broadcom/brcm80211/brcmfmac/pcie.c | 58 +++++++++----------
8 files changed, 110 insertions(+), 29 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/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
index 64fd77a378fd..0e996cf24f88 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),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
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..7897e6b6eefb
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/vops.h
@@ -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 */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 72036fec9a8e..501136e011b5 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -34,6 +34,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 ee23eb1809c4..274d512cbdad 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 {
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)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 094bb84ed72f..3e121e56e800 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -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 */ }
};
--
2.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 6/7] brcmfmac: add vendor name in revinfo debugfs file
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
` (4 preceding siblings ...)
2022-11-29 13:54 ` [PATCH V2 5/7] brcmfmac: add support Broadcom BCA " Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace Arend van Spriel
2022-11-29 13:58 ` [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
7 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 2648 bytes --]
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 584431150f7c..83ea251cfcec 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -1136,7 +1136,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 274d512cbdad..6f16157a8a4e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -192,3 +192,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 6b3aec190023..43df58bb70ad 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.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
` (5 preceding siblings ...)
2022-11-29 13:54 ` [PATCH V2 6/7] brcmfmac: add vendor name in revinfo debugfs file Arend van Spriel
@ 2022-11-29 13:54 ` Arend van Spriel
2022-11-29 13:58 ` [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
7 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:54 UTC (permalink / raw)
To: kvalo
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
[-- Attachment #1: Type: text/plain, Size: 3900 bytes --]
Using a namespace variant to make clear it is only intended to be used
by the vendor-specific modules. The symbol will only truly export the
symbols when the driver and consequently the vendor-specific part are
built as kernel modules.
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 a98b86982502..e4f911dd414b 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_MODULE(CONFIG_BRCMFMAC)
+#define BRCMF_EXPORT_SYMBOL_GPL(__sym) EXPORT_SYMBOL_NS_GPL(__sym, BRCMFMAC)
+#else
+#define BRCMF_EXPORT_SYMBOL_GPL(__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 6f16157a8a4e..86eafdb40541 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.c
@@ -109,7 +109,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)
{
@@ -142,7 +142,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.35.1
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH V2 0/7] brcmfmac: support devices from multiple vendors
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
` (6 preceding siblings ...)
2022-11-29 13:54 ` [PATCH V2 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace Arend van Spriel
@ 2022-11-29 13:58 ` Arend van Spriel
2022-12-01 11:12 ` Kalle Valo
7 siblings, 1 reply; 12+ messages in thread
From: Arend van Spriel @ 2022-11-29 13:58 UTC (permalink / raw)
To: kvalo; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 996 bytes --]
On 11/29/2022 2:54 PM, Arend van Spriel wrote:
> Took my sweet time coming with this follow-up series, but here
> it is. Hopefully, sending patches is working for me now.
>
> The bcm43xx family of wifi chipsets found its way to different
> groups inside and outside Broadcom. For the fullmac devices this
> means that in those difference groups firmware is being developed
> and the firmware api is bound to diverge. This series introduces
> a design change to accomodate supporting multiple firmware api's.
> The vender-specific support can be compiled in brcmfmac or
> built as a separate module. Currently the vendor-specific support
> does not have any real effect. At the momemt looking into SAE support
> which appear to be different for Cypress devices so that might be a
> first use-case.
>
> The patches apply to the main branch of the wireless-next repository.
Just realized I forgot the 'wifi:' prefix. Hopefully you can forgive me
this time? If not, I can resend.
Regards,
Arend
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH V2 0/7] brcmfmac: support devices from multiple vendors
2022-11-29 13:58 ` [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
@ 2022-12-01 11:12 ` Kalle Valo
2022-12-01 11:21 ` Arend van Spriel
0 siblings, 1 reply; 12+ messages in thread
From: Kalle Valo @ 2022-12-01 11:12 UTC (permalink / raw)
To: Arend van Spriel; +Cc: linux-wireless
Arend van Spriel <arend.vanspriel@broadcom.com> writes:
> On 11/29/2022 2:54 PM, Arend van Spriel wrote:
>> Took my sweet time coming with this follow-up series, but here
>> it is. Hopefully, sending patches is working for me now.
>>
>> The bcm43xx family of wifi chipsets found its way to different
>> groups inside and outside Broadcom. For the fullmac devices this
>> means that in those difference groups firmware is being developed
>> and the firmware api is bound to diverge. This series introduces
>> a design change to accomodate supporting multiple firmware api's.
>> The vender-specific support can be compiled in brcmfmac or
>> built as a separate module. Currently the vendor-specific support
>> does not have any real effect. At the momemt looking into SAE support
>> which appear to be different for Cypress devices so that might be a
>> first use-case.
>>
>> The patches apply to the main branch of the wireless-next repository.
>
> Just realized I forgot the 'wifi:' prefix. Hopefully you can forgive
> me this time? If not, I can resend.
Yeah, I can add that. When we switched to using "wifi:" I was mentally
(and in my tools) prepared to adding those the next couple of years :)
--
https://patchwork.kernel.org/project/linux-wireless/list/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH V2 0/7] brcmfmac: support devices from multiple vendors
2022-12-01 11:12 ` Kalle Valo
@ 2022-12-01 11:21 ` Arend van Spriel
0 siblings, 0 replies; 12+ messages in thread
From: Arend van Spriel @ 2022-12-01 11:21 UTC (permalink / raw)
To: Kalle Valo; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 1332 bytes --]
On 12/1/2022 12:12 PM, Kalle Valo wrote:
> Arend van Spriel <arend.vanspriel@broadcom.com> writes:
>
>> On 11/29/2022 2:54 PM, Arend van Spriel wrote:
>>> Took my sweet time coming with this follow-up series, but here
>>> it is. Hopefully, sending patches is working for me now.
>>>
>>> The bcm43xx family of wifi chipsets found its way to different
>>> groups inside and outside Broadcom. For the fullmac devices this
>>> means that in those difference groups firmware is being developed
>>> and the firmware api is bound to diverge. This series introduces
>>> a design change to accomodate supporting multiple firmware api's.
>>> The vender-specific support can be compiled in brcmfmac or
>>> built as a separate module. Currently the vendor-specific support
>>> does not have any real effect. At the momemt looking into SAE support
>>> which appear to be different for Cypress devices so that might be a
>>> first use-case.
>>>
>>> The patches apply to the main branch of the wireless-next repository.
>>
>> Just realized I forgot the 'wifi:' prefix. Hopefully you can forgive
>> me this time? If not, I can resend.
>
> Yeah, I can add that. When we switched to using "wifi:" I was mentally
> (and in my tools) prepared to adding those the next couple of years :)
From my side I will try to shorten that period ;-D
Gr. AvS
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [V2,1/7] wifi: brcmfmac: add function to unbind device to bus layer api
2022-11-29 13:54 ` [PATCH V2 1/7] brcmfmac: add function to unbind device to bus layer api Arend van Spriel
@ 2022-12-08 14:44 ` Kalle Valo
0 siblings, 0 replies; 12+ messages in thread
From: Kalle Valo @ 2022-12-08 14:44 UTC (permalink / raw)
To: Arend van Spriel
Cc: linux-wireless, Arend van Spriel, Hante Meuleman,
Pieter-Paul Giesberts, Franky Lin
Arend van Spriel <arend.vanspriel@broadcom.com> wrote:
> 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>
7 patches applied to wireless-next.git, thanks.
76821aad49ce wifi: brcmfmac: add function to unbind device to bus layer api
da6d9c8ecd00 wifi: brcmfmac: add firmware vendor info in driver info
d6a5c562214f wifi: brcmfmac: add support for vendor-specific firmware api
f74f1ec22dc2 wifi: brcmfmac: add support for Cypress firmware api
b1d94be570c2 wifi: brcmfmac: add support Broadcom BCA firmware api
7205f9f2fc55 wifi: brcmfmac: add vendor name in revinfo debugfs file
8041f2bffbf1 wifi: brcmfmac: introduce BRCMFMAC exported symbols namespace
--
https://patchwork.kernel.org/project/linux-wireless/patch/20221129135446.151065-2-arend.vanspriel@broadcom.com/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2022-12-08 14:44 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-29 13:54 [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 1/7] brcmfmac: add function to unbind device to bus layer api Arend van Spriel
2022-12-08 14:44 ` [V2,1/7] wifi: " Kalle Valo
2022-11-29 13:54 ` [PATCH V2 2/7] brcmfmac: add firmware vendor info in driver info Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 3/7] brcmfmac: add support for vendor-specific firmware api Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 4/7] brcmfmac: add support for Cypress " Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 5/7] brcmfmac: add support Broadcom BCA " Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 6/7] brcmfmac: add vendor name in revinfo debugfs file Arend van Spriel
2022-11-29 13:54 ` [PATCH V2 7/7] brcmfmac: introduce BRCMFMAC exported symbols namespace Arend van Spriel
2022-11-29 13:58 ` [PATCH V2 0/7] brcmfmac: support devices from multiple vendors Arend van Spriel
2022-12-01 11:12 ` Kalle Valo
2022-12-01 11:21 ` 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.