git: 22741535bcf4 - main - brcmfmac: make USB parts compile (and not panic right away)
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 10 Feb 2026 21:54:31 UTC
The branch main has been updated by bz:
URL: https://cgit.FreeBSD.org/src/commit/?id=22741535bcf4b003e41c0ecd22cca578359ba434
commit 22741535bcf4b003e41c0ecd22cca578359ba434
Author: Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2026-02-09 01:07:01 +0000
Commit: Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2026-02-10 21:37:13 +0000
brcmfmac: make USB parts compile (and not panic right away)
Fix casts and consts and add one extra error check for a NULL pointer.
This will require [a future] linuxkpi_usb.
There are very few dongles I know off:
- the original Raspberry PI USB dongle [1]
- Cisco Linksys AE1200
The reason for making USB compile despite the limited 11n 150/300 Mbit/s
adapters is that it is the simplest way to work on cfg80211 while on the
road, not requiring a full PCIe slot or another SoC for SDIO.
Sponsored by: The FreeBSD Foundation
Hardware donated by: Martin Husemann (martin NetBSD.org) [1]
MFC after: 3 days
---
sys/contrib/dev/broadcom/brcm80211/brcmfmac/bcdc.c | 6 +++
sys/contrib/dev/broadcom/brcm80211/brcmfmac/usb.c | 52 ++++++++++++++++++++++
2 files changed, 58 insertions(+)
diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/bcdc.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/bcdc.c
index 9ec0c60b6da1..7e846cbf5157 100644
--- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/bcdc.c
+++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/bcdc.c
@@ -387,12 +387,18 @@ brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
static void
brcmf_proto_bcdc_delete_peer(struct brcmf_pub *drvr, int ifidx,
+#if defined(__FreeBSD__)
+ const
+#endif
u8 peer[ETH_ALEN])
{
}
static void
brcmf_proto_bcdc_add_tdls_peer(struct brcmf_pub *drvr, int ifidx,
+#if defined(__FreeBSD__)
+ const
+#endif
u8 peer[ETH_ALEN])
{
}
diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/usb.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/usb.c
index f0129d10d2b9..46b7cf4380e6 100644
--- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/usb.c
+++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/usb.c
@@ -8,6 +8,9 @@
#include <linux/firmware.h>
#include <linux/usb.h>
#include <linux/vmalloc.h>
+#if defined(__FreeBSD__)
+#include <linux/delay.h>
+#endif
#include <brcmu_utils.h>
#include <brcm_hw_ids.h>
@@ -255,7 +258,11 @@ brcmf_usb_send_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
devinfo->ctl_out_pipe,
(unsigned char *) &devinfo->ctl_write,
buf, size,
+#if defined(__linux__)
(usb_complete_t)brcmf_usb_ctlwrite_complete,
+#elif defined(__FreeBSD__)
+ brcmf_usb_ctlwrite_complete,
+#endif
devinfo);
ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
@@ -289,7 +296,11 @@ brcmf_usb_recv_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
devinfo->ctl_in_pipe,
(unsigned char *) &devinfo->ctl_read,
buf, size,
+#if defined(__linux__)
(usb_complete_t)brcmf_usb_ctlread_complete,
+#elif defined(__FreeBSD__)
+ brcmf_usb_ctlread_complete,
+#endif
devinfo);
ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
@@ -768,7 +779,11 @@ static int brcmf_usb_dl_cmd(struct brcmf_usbdev_info *devinfo, u8 cmd,
usb_rcvctrlpipe(devinfo->usbdev, 0),
(unsigned char *) &devinfo->ctl_read,
(void *) tmpbuf, size,
+#if defined(__linux__)
(usb_complete_t)brcmf_usb_sync_complete, devinfo);
+#elif defined(__FreeBSD__)
+ brcmf_usb_sync_complete, devinfo);
+#endif
devinfo->ctl_completed = false;
ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
@@ -873,7 +888,11 @@ brcmf_usb_dl_send_bulk(struct brcmf_usbdev_info *devinfo, void *buffer, int len)
/* Prepare the URB */
usb_fill_bulk_urb(devinfo->bulk_urb, devinfo->usbdev,
devinfo->tx_pipe, buffer, len,
+#if defined(__linux__)
(usb_complete_t)brcmf_usb_sync_complete, devinfo);
+#elif defined(__FreeBSD__)
+ brcmf_usb_sync_complete, devinfo);
+#endif
devinfo->bulk_urb->transfer_flags |= URB_ZERO_PACKET;
@@ -888,10 +907,19 @@ brcmf_usb_dl_send_bulk(struct brcmf_usbdev_info *devinfo, void *buffer, int len)
}
static int
+#if defined(__linux__)
brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
+#elif defined(__FreeBSD__)
+brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, const u8 *fw, int fwlen)
+#endif
{
unsigned int sendlen, sent, dllen;
+#if defined(__linux__)
char *bulkchunk = NULL, *dlpos;
+#elif defined(__FreeBSD__)
+ char *bulkchunk = NULL;
+ const u8 *dlpos;
+#endif
struct rdl_state_le state;
u32 rdlstate, rdlbytes;
int err = 0;
@@ -973,7 +1001,11 @@ fail:
return err;
}
+#if defined(__linux__)
static int brcmf_usb_dlstart(struct brcmf_usbdev_info *devinfo, u8 *fw, int len)
+#elif defined(__FreeBSD__)
+static int brcmf_usb_dlstart(struct brcmf_usbdev_info *devinfo, const u8 *fw, int len)
+#endif
{
int err;
@@ -1049,7 +1081,11 @@ brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
goto out;
err = brcmf_usb_dlstart(devinfo,
+#if defined(__linux__)
(u8 *)devinfo->image, devinfo->image_len);
+#elif defined(__FreeBSD__)
+ (const u8 *)devinfo->image, devinfo->image_len);
+#endif
if (err == 0)
err = brcmf_usb_dlrun(devinfo);
@@ -1080,12 +1116,20 @@ static void brcmf_usb_detach(struct brcmf_usbdev_info *devinfo)
static int check_file(const u8 *headers)
{
+#if defined(__linux__)
struct trx_header_le *trx;
+#elif defined(__FreeBSD__)
+ const struct trx_header_le *trx;
+#endif
int actual_len = -1;
brcmf_dbg(USB, "Enter\n");
/* Extract trx header */
+#if defined(__linux__)
trx = (struct trx_header_le *) headers;
+#elif defined(__FreeBSD__)
+ trx = (const struct trx_header_le *) headers;
+#endif
if (trx->magic != cpu_to_le32(TRX_MAGIC))
return -1;
@@ -1187,6 +1231,10 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
fw = fwreq->items[BRCMF_USB_FW_CODE].binary;
kfree(fwreq);
+#if defined(__FreeBSD__)
+ if (fw == NULL)
+ goto error;
+#endif
ret = check_file(fw->data);
if (ret < 0) {
@@ -1602,3 +1650,7 @@ int brcmf_usb_register(void)
brcmf_dbg(USB, "Enter\n");
return usb_register(&brcmf_usbdrvr);
}
+
+#if defined(__FreeBSD__)
+MODULE_DEPEND(brcmfmac, linuxkpi_usb, 1, 1, 1);
+#endif