The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=22741535bcf4b003e41c0ecd22cca578359ba434
commit 22741535bcf4b003e41c0ecd22cca578359ba434 Author: Bjoern A. Zeeb <[email protected]> AuthorDate: 2026-02-09 01:07:01 +0000 Commit: Bjoern A. Zeeb <[email protected]> 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
