git: 22741535bcf4 - main - brcmfmac: make USB parts compile (and not panic right away)

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
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