diff options
| author | Bjoern A. Zeeb <bz@FreeBSD.org> | 2026-02-10 21:33:09 +0000 |
|---|---|---|
| committer | Bjoern A. Zeeb <bz@FreeBSD.org> | 2026-02-10 21:36:29 +0000 |
| commit | 902136e0fe112383ec64d2ef43a446063b5e6417 (patch) | |
| tree | 75536a6e2af0110ed0d7ed270a32d7d886ae3163 /sys/contrib | |
| parent | b4c3e9b5b09c829b4135aff738bd2893ed052377 (diff) | |
Diffstat (limited to 'sys/contrib')
20 files changed, 609 insertions, 0 deletions
diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/cfg80211.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/cfg80211.c index 8af402555b5e..35f68b370714 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -5,13 +5,21 @@ /* Toplevel file. Relies on dhd_linux.c to send commands to the dongle. */ +#if defined(__FreeBSD__) +#include <net/cfg80211.h> +#endif #include <linux/kernel.h> #include <linux/etherdevice.h> #include <linux/module.h> #include <linux/vmalloc.h> +#if defined(__linux__) #include <net/cfg80211.h> +#endif #include <net/netlink.h> #include <uapi/linux/if_arp.h> +#if defined(__FreeBSD__) +#include <linux/delay.h> +#endif #include <brcmu_utils.h> #include <defs.h> @@ -36,6 +44,24 @@ #define BRCMF_SCAN_IE_LEN_MAX 2048 +#if defined(__FreeBSD__) +#ifdef WPA_OUI +#undef WPA_OUI +#endif +#ifdef WPA_OUI_TYPE +#undef WPA_OUI_TYPE +#endif +#ifdef RSN_OUI +#undef RSN_OUI +#endif +#ifdef WME_OUI_TYPE +#undef WME_OUI_TYPE +#endif +#ifdef WPS_OUI_TYPE +#undef WPS_OUI_TYPE +#endif +#endif + #define WPA_OUI "\x00\x50\xF2" /* WPA OUI */ #define WPA_OUI_TYPE 1 #define RSN_OUI "\x00\x0F\xAC" /* RSN OUI */ @@ -257,7 +283,11 @@ struct brcmf_vs_tlv { }; struct parsed_vndr_ie_info { +#if defined(__linux__) u8 *ie_ptr; +#elif defined(__FreeBSD__) + const u8 *ie_ptr; +#endif u32 ie_len; /* total length including id & length field */ struct brcmf_vs_tlv vndrie; }; @@ -429,7 +459,11 @@ brcmf_parse_tlvs(const void *buf, int buflen, uint key) if ((elt->id == key) && (totlen >= (len + TLV_HDR_LEN))) return elt; +#if defined(__linux__) elt = (struct brcmf_tlv *)((u8 *)elt + (len + TLV_HDR_LEN)); +#elif defined(__FreeBSD__) + elt = (const struct brcmf_tlv *)((const u8 *)elt + (len + TLV_HDR_LEN)); +#endif totlen -= (len + TLV_HDR_LEN); } @@ -462,7 +496,11 @@ brcmf_tlv_has_ie(const u8 *ie, const u8 **tlvs, u32 *tlvs_len, return false; } +#if defined(__linux__) static struct brcmf_vs_tlv * +#elif defined(__FreeBSD__) +static const struct brcmf_vs_tlv * +#endif brcmf_find_wpaie(const u8 *parse, u32 len) { const struct brcmf_tlv *ie; @@ -470,20 +508,34 @@ brcmf_find_wpaie(const u8 *parse, u32 len) while ((ie = brcmf_parse_tlvs(parse, len, WLAN_EID_VENDOR_SPECIFIC))) { if (brcmf_tlv_has_ie((const u8 *)ie, &parse, &len, WPA_OUI, TLV_OUI_LEN, WPA_OUI_TYPE)) +#if defined(__linux__) return (struct brcmf_vs_tlv *)ie; +#elif defined(__FreeBSD__) + return (const struct brcmf_vs_tlv *)ie; +#endif } return NULL; } +#if defined(__linux__) static struct brcmf_vs_tlv * +#elif defined(__FreeBSD__) +static const struct brcmf_vs_tlv * +#endif brcmf_find_wpsie(const u8 *parse, u32 len) { const struct brcmf_tlv *ie; while ((ie = brcmf_parse_tlvs(parse, len, WLAN_EID_VENDOR_SPECIFIC))) { +#if defined(__linux__) if (brcmf_tlv_has_ie((u8 *)ie, &parse, &len, WPA_OUI, TLV_OUI_LEN, WPS_OUI_TYPE)) return (struct brcmf_vs_tlv *)ie; +#elif defined(__FreeBSD__) + if (brcmf_tlv_has_ie((const u8 *)ie, &parse, &len, + WPA_OUI, TLV_OUI_LEN, WPS_OUI_TYPE)) + return (const struct brcmf_vs_tlv *)ie; +#endif } return NULL; } @@ -1239,8 +1291,13 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg, reqid = brcmf_pno_find_reqid_by_bucket(cfg->pno, bucket); if (!aborted) { +#if defined(__linux__) brcmf_dbg(SCAN, "report results: reqid=%llu\n", reqid); +#elif defined(__FreeBSD__) + brcmf_dbg(SCAN, "report results: reqid=%ju\n", + (uintmax_t)reqid); +#endif cfg80211_sched_scan_results(cfg_to_wiphy(cfg), reqid); } @@ -2413,7 +2470,11 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev, ie = NULL; ie_len = 0; /* find the WPA_IE */ +#if defined(__linux__) wpa_ie = brcmf_find_wpaie((u8 *)sme->ie, sme->ie_len); +#elif defined(__FreeBSD__) + wpa_ie = brcmf_find_wpaie(sme->ie, sme->ie_len); +#endif if (wpa_ie) { ie = wpa_ie; ie_len = wpa_ie->len + TLV_HDR_LEN; @@ -2450,7 +2511,11 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev, chanspec = 0; } +#if defined(__linux__) brcmf_dbg(INFO, "ie (%p), ie_len (%zd)\n", sme->ie, sme->ie_len); +#elif defined(__FreeBSD__) + brcmf_dbg(INFO, "ie (%p), ie_len (%u)\n", sme->ie, sme->ie_len); +#endif err = brcmf_set_wpa_version(ndev, sme); if (err) { @@ -2840,7 +2905,11 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, key = &ifp->vif->profile.key[key_idx]; memset(key, 0, sizeof(*key)); if ((ext_key) && (!is_multicast_ether_addr(mac_addr))) +#if defined(__linux__) memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN); +#elif defined(__FreeBSD__) + memcpy((char *)&key->ea, mac_addr, ETH_ALEN); +#endif key->len = params->key_len; key->index = key_idx; memcpy(key->data, params->key, key->len); @@ -2849,9 +2918,15 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, if (params->seq && params->seq_len == 6) { /* rx iv */ +#if defined(__linux__) u8 *ivptr; ivptr = (u8 *)params->seq; +#elif defined(__FreeBSD__) + const u8 *ivptr; + + ivptr = params->seq; +#endif key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | (ivptr[3] << 8) | ivptr[2]; key->rxiv.lo = (ivptr[1] << 8) | ivptr[0]; @@ -3758,8 +3833,13 @@ brcmf_alloc_internal_escan_request(struct wiphy *wiphy, u32 n_netinfo) { req = kzalloc(req_size, GFP_KERNEL); if (req) { req->wiphy = wiphy; +#if defined(__linux__) req->ssids = (void *)(&req->channels[0]) + n_netinfo * sizeof(req->channels[0]); +#elif defined(__FreeBSD__) + req->ssids = (void *)((&req->channels[0]) + + n_netinfo * sizeof(req->channels[0])); +#endif } return req; } @@ -3902,7 +3982,11 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp, } netinfo_start = brcmf_get_netinfo_array(pfn_result); +#if defined(__linux__) datalen = e->datalen - ((void *)netinfo_start - (void *)pfn_result); +#elif defined(__FreeBSD__) + datalen = e->datalen - ((u8 *)netinfo_start - (u8 *)pfn_result); +#endif if (datalen < result_count * sizeof(*netinfo)) { bphy_err(drvr, "insufficient event data\n"); goto out_err; @@ -3992,7 +4076,11 @@ static __always_inline void brcmf_delay(u32 ms) cond_resched(); mdelay(ms); } else { +#if defined(__linux__) msleep(ms); +#elif defined(__FreeBSD__) + linux_msleep(ms); +#endif } } @@ -4529,7 +4617,11 @@ static s32 brcmf_configure_opensecurity(struct brcmf_if *ifp) return 0; } +#if defined(__linux__) static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie) +#elif defined(__FreeBSD__) +static bool brcmf_valid_wpa_oui(const u8 *oui, bool is_rsn_ie) +#endif { if (is_rsn_ie) return (memcmp(oui, RSN_OUI, TLV_OUI_LEN) == 0); @@ -4553,7 +4645,11 @@ brcmf_configure_wpaie(struct brcmf_if *ifp, u32 gval = 0; u32 wpa_auth = 0; u32 offset; +#if defined(__linux__) u8 *data; +#elif defined(__FreeBSD__) + const u8 *data; +#endif u16 rsn_cap; u32 wme_bss_disable; u32 mfp; @@ -4563,7 +4659,11 @@ brcmf_configure_wpaie(struct brcmf_if *ifp, goto exit; len = wpa_ie->len + TLV_HDR_LEN; +#if defined(__linux__) data = (u8 *)wpa_ie; +#elif defined(__FreeBSD__) + data = (const u8 *)wpa_ie; +#endif offset = TLV_HDR_LEN; if (!is_rsn_ie) offset += VS_IE_FIXED_HDR_LEN; @@ -4786,19 +4886,32 @@ static s32 brcmf_parse_vndr_ies(const u8 *vndr_ie_buf, u32 vndr_ie_len, struct parsed_vndr_ies *vndr_ies) { +#if defined(__linux__) struct brcmf_vs_tlv *vndrie; struct brcmf_tlv *ie; +#elif defined(__FreeBSD__) + const struct brcmf_vs_tlv *vndrie; + const struct brcmf_tlv *ie; +#endif struct parsed_vndr_ie_info *parsed_info; s32 remaining_len; remaining_len = (s32)vndr_ie_len; memset(vndr_ies, 0, sizeof(*vndr_ies)); +#if defined(__linux__) ie = (struct brcmf_tlv *)vndr_ie_buf; +#elif defined(__FreeBSD__) + ie = (const struct brcmf_tlv *)vndr_ie_buf; +#endif while (ie) { if (ie->id != WLAN_EID_VENDOR_SPECIFIC) goto next; +#if defined(__linux__) vndrie = (struct brcmf_vs_tlv *)ie; +#elif defined(__FreeBSD__) + vndrie = (const struct brcmf_vs_tlv *)ie; +#endif /* len should be bigger than OUI length + one */ if (vndrie->len < (VS_IE_FIXED_HDR_LEN - TLV_HDR_LEN + 1)) { brcmf_err("invalid vndr ie. length is too small %d\n", @@ -4816,7 +4929,11 @@ brcmf_parse_vndr_ies(const u8 *vndr_ie_buf, u32 vndr_ie_len, parsed_info = &vndr_ies->ie_info[vndr_ies->count]; /* save vndr ie information */ +#if defined(__linux__) parsed_info->ie_ptr = (char *)vndrie; +#elif defined(__FreeBSD__) + parsed_info->ie_ptr = (const char *)vndrie; +#endif parsed_info->ie_len = vndrie->len + TLV_HDR_LEN; memcpy(&parsed_info->vndrie, vndrie, sizeof(*vndrie)); @@ -4833,14 +4950,22 @@ next: if (remaining_len <= TLV_HDR_LEN) ie = NULL; else +#if defined(__linux__) ie = (struct brcmf_tlv *)(((u8 *)ie) + ie->len + +#elif defined(__FreeBSD__) + ie = (const struct brcmf_tlv *)(((const u8 *)ie) + ie->len + +#endif TLV_HDR_LEN); } return 0; } static u32 +#if defined(__linux__) brcmf_vndr_ie(u8 *iebuf, s32 pktflag, u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd) +#elif defined(__FreeBSD__) +brcmf_vndr_ie(u8 *iebuf, s32 pktflag, const u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd) +#endif { strscpy(iebuf, add_del_cmd, VNDR_IE_CMD_LEN); @@ -5085,11 +5210,19 @@ brcmf_parse_configure_security(struct brcmf_if *ifp, s32 err = 0; /* find the RSN_IE */ +#if defined(__linux__) rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, +#elif defined(__FreeBSD__) + rsn_ie = brcmf_parse_tlvs(settings->beacon.tail, +#endif settings->beacon.tail_len, WLAN_EID_RSN); /* find the WPA_IE */ +#if defined(__linux__) wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail, +#elif defined(__FreeBSD__) + wpa_ie = brcmf_find_wpaie(settings->beacon.tail, +#endif settings->beacon.tail_len); if (wpa_ie || rsn_ie) { @@ -5100,9 +5233,16 @@ brcmf_parse_configure_security(struct brcmf_if *ifp, if (err < 0) return err; } else { +#if defined(__linux__) struct brcmf_vs_tlv *tmp_ie; tmp_ie = (struct brcmf_vs_tlv *)rsn_ie; +#elif defined(__FreeBSD__) + const struct brcmf_vs_tlv *tmp_ie; + + tmp_ie = (const struct brcmf_vs_tlv *)rsn_ie; +#endif + /* RSN IE */ err = brcmf_configure_wpaie(ifp, tmp_ie, true); @@ -5155,7 +5295,11 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, &ifp->vif->is_11d)) { is_11d = supports_11d = false; } else { +#if defined(__linux__) country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, +#elif defined(__FreeBSD__) + country_ie = brcmf_parse_tlvs(settings->beacon.tail, +#endif settings->beacon.tail_len, WLAN_EID_COUNTRY); is_11d = country_ie ? 1 : 0; @@ -5166,7 +5310,11 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, if (settings->ssid == NULL || settings->ssid_len == 0) { ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN; ssid_ie = brcmf_parse_tlvs( +#if defined(__linux__) (u8 *)&settings->beacon.head[ie_offset], +#elif defined(__FreeBSD__) + &settings->beacon.head[ie_offset], +#endif settings->beacon.head_len - ie_offset, WLAN_EID_SSID); if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN) @@ -5382,7 +5530,11 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev, if (ifp->vif->wdev.iftype == NL80211_IFTYPE_AP) { /* Due to most likely deauths outstanding we sleep */ /* first to make sure they get processed by fw. */ +#if defined(__linux__) msleep(400); +#elif defined(__FreeBSD__) + linux_msleep(400); +#endif if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) { struct cfg80211_crypto_settings crypto = {}; @@ -5504,10 +5656,18 @@ brcmf_cfg80211_change_station(struct wiphy *wiphy, struct net_device *ndev, if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED)) err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SCB_AUTHORIZE, +#if defined(__linux__) (void *)mac, ETH_ALEN); +#elif defined(__FreeBSD__) + __DECONST(u8 *, mac), ETH_ALEN); +#endif else err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SCB_DEAUTHORIZE, +#if defined(__linux__) (void *)mac, ETH_ALEN); +#elif defined(__FreeBSD__) + __DECONST(u8 *, mac), ETH_ALEN); +#endif if (err < 0) bphy_err(drvr, "Setting SCB (de-)authorize failed, %d\n", err); @@ -5623,8 +5783,13 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN], le16_to_cpu(action_frame->len)); +#if defined(__linux__) brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, channel=%d\n", *cookie, le16_to_cpu(action_frame->len), +#elif defined(__FreeBSD__) + brcmf_dbg(TRACE, "Action frame, cookie=%ju, len=%d, channel=%d\n", + (uintmax_t)*cookie, le16_to_cpu(action_frame->len), +#endif le32_to_cpu(af_params->channel)); ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg), @@ -5815,11 +5980,19 @@ brcmf_notify_tdls_peer_event(struct brcmf_if *ifp, break; case BRCMF_E_REASON_TDLS_PEER_CONNECTED: brcmf_dbg(TRACE, "TDLS Peer Connected\n"); +#if defined(__linux__) brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); +#elif defined(__FreeBSD__) + brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, e->addr); +#endif break; case BRCMF_E_REASON_TDLS_PEER_DISCONNECTED: brcmf_dbg(TRACE, "TDLS Peer Disconnected\n"); +#if defined(__linux__) brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); +#elif defined(__FreeBSD__) + brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, e->addr); +#endif break; } @@ -6553,7 +6726,11 @@ brcmf_notify_connect_status(struct brcmf_if *ifp, (e->event_code == BRCMF_E_DEAUTH_IND) || (e->event_code == BRCMF_E_DISASSOC_IND) || ((e->event_code == BRCMF_E_LINK) && (!e->flags))) { +#if defined(__linux__) brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr); +#elif defined(__FreeBSD__) + brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, e->addr); +#endif } if (brcmf_is_apmode(ifp->vif)) { @@ -6640,7 +6817,11 @@ brcmf_notify_mic_status(struct brcmf_if *ifp, else key_type = NL80211_KEYTYPE_PAIRWISE; +#if defined(__linux__) cfg80211_michael_mic_failure(ifp->ndev, (u8 *)&e->addr, key_type, -1, +#elif defined(__FreeBSD__) + cfg80211_michael_mic_failure(ifp->ndev, e->addr, key_type, -1, +#endif NULL, GFP_KERNEL); return 0; @@ -8183,7 +8364,11 @@ brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev, goto exit; /* Add 10 ms for IOVAR completion */ +#if defined(__linux__) msleep(ACS_MSRMNT_DELAY + 10); +#elif defined(__FreeBSD__) + linux_msleep(ACS_MSRMNT_DELAY + 10); +#endif /* Issue IOVAR to collect measurement results */ req.msrmnt_query = 1; @@ -8204,8 +8389,13 @@ brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev, brcmf_dbg(INFO, "OBSS dump: channel %d: survey duration %d\n", ieee80211_frequency_to_channel(info->channel->center_freq), ACS_MSRMNT_DELAY); +#if defined(__linux__) brcmf_dbg(INFO, "noise(%d) busy(%llu) rx(%llu) tx(%llu)\n", info->noise, info->time_busy, info->time_rx, info->time_tx); +#elif defined(__FreeBSD__) + brcmf_dbg(INFO, "noise(%d) busy(%ju) rx(%ju) tx(%ju)\n", + info->noise, (uintmax_t)info->time_busy, (uintmax_t)info->time_rx, (uintmax_t)info->time_tx); +#endif exit: if (!brcmf_is_apmode(ifp->vif)) diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/common.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/common.c index 688f16c51319..17e408b7fa23 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/common.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/common.c @@ -3,6 +3,10 @@ * Copyright (c) 2010 Broadcom Corporation */ +#if defined(__FreeBSD__) +#define LINUXKPI_PARAM_PREFIX brcmfmac_ +#endif + #include <linux/kernel.h> #include <linux/string.h> #include <linux/netdevice.h> @@ -24,6 +28,12 @@ MODULE_AUTHOR("Broadcom Corporation"); MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); MODULE_LICENSE("Dual BSD/GPL"); +#if defined(__FreeBSD__) +MODULE_DEPEND(brcmfmac, brcmutil, 1, 1, 1); +MODULE_DEPEND(brcmfmac, linuxkpi, 1, 1, 1); +MODULE_DEPEND(brcmfmac, linuxkpi_wlan, 1, 1, 1); +MODULE_DEPEND(brcmfmac, lindebugfs, 1, 1, 1); /* XXX-BZ someone should fix this */ +#endif #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40 #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40 @@ -118,7 +128,11 @@ static int brcmf_c_download(struct brcmf_if *ifp, u16 flag, } static int brcmf_c_download_blob(struct brcmf_if *ifp, +#if defined(__linux__) const void *data, size_t size, +#elif defined(__FreeBSD__) + const u8 *data, size_t size, +#endif const char *loadvar, const char *statvar) { struct brcmf_pub *drvr = ifp->drvr; @@ -467,10 +481,22 @@ void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...) vaf.fmt = fmt; vaf.va = &args; +#if defined(__linux__) if (bus) dev_err(bus->dev, "%s: %pV", func, &vaf); else pr_err("%s: %pV", func, &vaf); +#elif defined(__FreeBSD__) + { + char *str; + vasprintf(&str, M_KMALLOC, vaf.fmt, args); + if (bus) + dev_err(bus->dev, "ERROR: %s: %s", func, str); + else + pr_err("ERROR: %s: %s", func, str); + free(str, M_KMALLOC); + } +#endif va_end(args); } @@ -487,7 +513,16 @@ void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...) va_start(args, fmt); vaf.va = &args; if (brcmf_msg_level & level) +#if defined(__linux__) pr_debug("%s %pV", func, &vaf); +#elif defined(__FreeBSD__) + { + char *str; + vasprintf(&str, M_KMALLOC, vaf.fmt, args); + pr_debug("%s %s", func, str); + free(str, M_KMALLOC); + } +#endif trace_brcmf_dbg(level, func, &vaf); va_end(args); } diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/commonring.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/commonring.c index e44236cb210e..c0880fa12f57 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/commonring.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/commonring.c @@ -119,8 +119,13 @@ again: available = commonring->r_ptr - commonring->w_ptr; if (available > 1) { +#if defined(__linux__) ret_ptr = commonring->buf_addr + (commonring->w_ptr * commonring->item_len); +#elif defined(__FreeBSD__) + ret_ptr = (void *)((uintptr_t)commonring->buf_addr + + (commonring->w_ptr * commonring->item_len)); +#endif commonring->w_ptr++; if (commonring->w_ptr == commonring->depth) commonring->w_ptr = 0; @@ -155,8 +160,13 @@ again: available = commonring->r_ptr - commonring->w_ptr; if (available > 1) { +#if defined(__linux__) ret_ptr = commonring->buf_addr + (commonring->w_ptr * commonring->item_len); +#elif defined(__FreeBSD__) + ret_ptr = (void *)((uintptr_t)commonring->buf_addr + + (commonring->w_ptr * commonring->item_len)); +#endif *alloced = min_t(u16, n_items, available - 1); if (*alloced + commonring->w_ptr > commonring->depth) *alloced = commonring->depth - commonring->w_ptr; @@ -217,8 +227,13 @@ void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring, if (*n_items == 0) return NULL; +#if defined(__linux__) return commonring->buf_addr + (commonring->r_ptr * commonring->item_len); +#elif defined(__FreeBSD__) + return (void *)((uintptr_t)commonring->buf_addr + + (commonring->r_ptr * commonring->item_len)); +#endif } diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.c index eecf8a38d94a..dc1158469654 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.c @@ -17,7 +17,11 @@ int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data, size_t len) { +#if defined(__linux__) void *dump; +#elif defined(__FreeBSD__) + u8 *dump; +#endif size_t ramsize; int err; @@ -51,6 +55,10 @@ void brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn, int (*read_fn)(struct seq_file *seq, void *data)) { WARN(!drvr->wiphy->debugfsdir, "wiphy not (yet) registered\n"); +#if defined(__linux__) debugfs_create_devm_seqfile(drvr->bus_if->dev, fn, drvr->wiphy->debugfsdir, read_fn); +#elif defined(__FreeBSD__) + pr_debug("%s: TODO\n", __func__); +#endif } diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.h b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.h index 9bb5f709d41a..6f3dab1987fc 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.h +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.h @@ -6,6 +6,9 @@ #ifndef BRCMFMAC_DEBUG_H #define BRCMFMAC_DEBUG_H +#if defined(__FreeBSD__) +#include <linux/printk.h> +#endif #include <linux/net.h> /* net_ratelimit() */ /* message levels */ @@ -64,18 +67,30 @@ void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...); wiphy_info_once((drvr)->wiphy, "%s: " fmt, __func__, \ ##__VA_ARGS__) +/* #if defined(__linux__) #if defined(DEBUG) || defined(CONFIG_BRCM_TRACING) +#elif defined(__FreeBSD__) */ +#if defined(DEBUG) || defined(CONFIG_BRCM_TRACING) || defined(CONFIG_BRCMDBG) +/* #endif */ /* For debug/tracing purposes treat info messages as errors */ #define brcmf_info brcmf_err __printf(3, 4) void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...); +#if defined(__linux__) #define brcmf_dbg(level, fmt, ...) \ do { \ __brcmf_dbg(BRCMF_##level##_VAL, __func__, \ fmt, ##__VA_ARGS__); \ } while (0) +#elif defined(__FreeBSD__) +#define brcmf_dbg(level, ...) \ +do { \ + __brcmf_dbg(BRCMF_##level##_VAL, __func__, \ + __VA_ARGS__); \ +} while (0) +#endif #define BRCMF_DATA_ON() (brcmf_msg_level & BRCMF_DATA_VAL) #define BRCMF_CTL_ON() (brcmf_msg_level & BRCMF_CTL_VAL) #define BRCMF_HDRS_ON() (brcmf_msg_level & BRCMF_HDRS_VAL) @@ -107,12 +122,21 @@ do { \ #endif /* defined(DEBUG) || defined(CONFIG_BRCM_TRACING) */ +#if defined(__linux__) #define brcmf_dbg_hex_dump(test, data, len, fmt, ...) \ do { \ trace_brcmf_hexdump((void *)data, len); \ if (test) \ brcmu_dbg_hex_dump(data, len, fmt, ##__VA_ARGS__); \ } while (0) +#elif defined(__FreeBSD__) +#define brcmf_dbg_hex_dump(test, data, len, fmt, ...) \ +do { \ + trace_brcmf_hexdump(data, len); \ + if (test) \ + brcmu_dbg_hex_dump(data, len, fmt, ##__VA_ARGS__); \ +} while (0) +#endif extern int brcmf_msg_level; diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/firmware.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/firmware.c index 83f8ed7d00f9..aa8f05e822a0 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/firmware.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/firmware.c @@ -144,15 +144,25 @@ static enum nvram_parser_state brcmf_nvram_handle_value(struct nvram_parser *nvp) { char c; +#if defined(__linux__) char *skv; char *ekv; +#elif defined(__FreeBSD__) + const char *skv; + const char *ekv; +#endif u32 cplen; c = nvp->data[nvp->pos]; if (!is_nvram_char(c)) { /* key,value pair complete */ +#if defined(__linux__) ekv = (u8 *)&nvp->data[nvp->pos]; skv = (u8 *)&nvp->data[nvp->entry]; +#elif defined(__FreeBSD__) + ekv = &nvp->data[nvp->pos]; + skv = &nvp->data[nvp->entry]; +#endif cplen = ekv - skv; if (nvp->nvram_len + cplen + 1 >= BRCMF_FW_MAX_NVRAM_SIZE) return END; @@ -171,9 +181,15 @@ brcmf_nvram_handle_value(struct nvram_parser *nvp) static enum nvram_parser_state brcmf_nvram_handle_comment(struct nvram_parser *nvp) { +#if defined(__linux__) char *eoc, *sol; sol = (char *)&nvp->data[nvp->pos]; +#elif defined(__FreeBSD__) + const char *eoc, *sol; + + sol = &nvp->data[nvp->pos]; +#endif eoc = strchr(sol, '\n'); if (!eoc) { eoc = strchr(sol, '\0'); @@ -543,7 +559,11 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) bool kfree_nvram = false; u32 nvram_length = 0; void *nvram = NULL; +#if defined(__linux__) u8 *data = NULL; +#elif defined(__FreeBSD__) + const u8 *data = NULL; +#endif size_t data_len; brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev)); @@ -551,7 +571,11 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) cur = &fwctx->req->items[fwctx->curpos]; if (fw && fw->data) { +#if defined(__linux__) data = (u8 *)fw->data; +#elif defined(__FreeBSD__) + data = fw->data; +#endif data_len = fw->size; } else { if ((data = bcm47xx_nvram_get_contents(&data_len))) diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.c index e1127d7e086d..17387adb0301 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.c @@ -65,13 +65,21 @@ u32 brcmf_flowring_lookup(struct brcmf_flowring *flow, u8 da[ETH_ALEN], bool found; bool sta; u8 fifo; +#if defined(__linux__) u8 *mac; +#elif defined(__FreeBSD__) + const u8 *mac; +#endif fifo = brcmf_flowring_prio2fifo[prio]; sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT); mac = da; if ((!sta) && (is_multicast_ether_addr(da))) { +#if defined(__linux__) mac = (u8 *)ALLFFMAC; +#elif defined(__FreeBSD__) + mac = ALLFFMAC; +#endif fifo = 0; } if ((sta) && (flow->tdls_active) && @@ -110,13 +118,21 @@ u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN], bool found; u8 fifo; bool sta; +#if defined(__linux__) u8 *mac; +#elif defined(__FreeBSD__) + const u8 *mac; +#endif fifo = brcmf_flowring_prio2fifo[prio]; sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT); mac = da; if ((!sta) && (is_multicast_ether_addr(da))) { +#if defined(__linux__) mac = (u8 *)ALLFFMAC; +#elif defined(__FreeBSD__) + mac = ALLFFMAC; +#endif fifo = 0; } if ((sta) && (flow->tdls_active) && @@ -428,7 +444,11 @@ void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx, void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx, +#if defined(__linux__) u8 peer[ETH_ALEN]) +#elif defined(__FreeBSD__) + const u8 peer[ETH_ALEN]) +#endif { struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev); struct brcmf_pub *drvr = bus_if->drvr; @@ -475,7 +495,11 @@ void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx, void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx, +#if defined(__linux__) u8 peer[ETH_ALEN]) +#elif defined(__FreeBSD__) + const u8 peer[ETH_ALEN]) +#endif { struct brcmf_flowring_tdls_entry *tdls_entry; struct brcmf_flowring_tdls_entry *search; diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.h b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.h index 818882b0fd01..2d69c9701862 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.h +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.h @@ -66,9 +66,17 @@ void brcmf_flowring_detach(struct brcmf_flowring *flow); void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx, enum proto_addr_mode addr_mode); void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx, +#if defined(__linux__) u8 peer[ETH_ALEN]); +#elif defined(__FreeBSD__) + const u8 peer[ETH_ALEN]); +#endif void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx, +#if defined(__linux__) u8 peer[ETH_ALEN]); +#elif defined(__FreeBSD__) + const u8 peer[ETH_ALEN]); +#endif #endif /* BRCMFMAC_FLOWRING_H */ diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.c index 6385a7db7f7d..6b2ac2b77545 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.c @@ -246,7 +246,11 @@ brcmf_fil_iovar_data_get(struct brcmf_if *ifp, const char *name, void *data, BRCMF_EXPORT_SYMBOL_GPL(brcmf_fil_iovar_data_get); static u32 +#if defined(__linux__) brcmf_create_bsscfg(s32 bsscfgidx, const char *name, char *data, u32 datalen, +#elif defined(__FreeBSD__) +brcmf_create_bsscfg(s32 bsscfgidx, const char *name, const char *data, u32 datalen, +#endif char *buf, u32 buflen) { const s8 *prefix = "bsscfg:"; @@ -292,7 +296,11 @@ brcmf_create_bsscfg(s32 bsscfgidx, const char *name, char *data, u32 datalen, s32 brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, const char *name, +#if defined(__linux__) void *data, u32 len) +#elif defined(__FreeBSD__) + const void *data, u32 len) +#endif { struct brcmf_pub *drvr = ifp->drvr; s32 err; diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.h b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.h index ab3d6cfcb02b..767491965756 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.h +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.h @@ -147,7 +147,11 @@ s32 brcmf_fil_iovar_int_query(struct brcmf_if *ifp, const char *name, u32 *data) s32 brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, const char *name, +#if defined(__linux__) void *data, u32 len); +#elif defined(__FreeBSD__) + const void *data, u32 len); +#endif s32 brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, const char *name, void *data, u32 len); static inline diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwvid.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwvid.c index 41eafcda77f7..a14de1511eab 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwvid.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwvid.c @@ -35,19 +35,37 @@ struct brcmf_fwvid_entry { static DEFINE_MUTEX(fwvid_list_lock); #if IS_MODULE(CONFIG_BRCMFMAC) +#if defined(__linux__) #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), \ } +#elif defined(__FreeBSD__) +#define FWVID_ENTRY_INIT(_vid, _name) \ + [BRCMF_FWVENDOR_ ## _vid] = { \ + .name = #_name, \ + .reg_done = COMPLETION_INITIALIZER(fwvid_list[BRCMF_FWVENDOR_ ## _vid].reg_done), \ + .drvr_list = LINUX_LIST_HEAD_INIT(fwvid_list[BRCMF_FWVENDOR_ ## _vid].drvr_list), \ + } +#endif #else +#if defined(__linux__) #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 \ } +#elif defined(__FreeBSD__) +#define FWVID_ENTRY_INIT(_vid, _name) \ + [BRCMF_FWVENDOR_ ## _vid] = { \ + .name = #_name, \ + .drvr_list = LINUX_LIST_HEAD_INIT(fwvid_list[BRCMF_FWVENDOR_ ## _vid].drvr_list), \ + .vops = _vid ## _VOPS \ + } +#endif #endif /* IS_MODULE(CONFIG_BRCMFMAC) */ static struct brcmf_fwvid_entry fwvid_list[BRCMF_FWVENDOR_NUM] = { diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/msgbuf.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/msgbuf.c index 45fbcbdc7d9e..1b7b3454a9be 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/msgbuf.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/msgbuf.c @@ -11,6 +11,12 @@ #include <linux/types.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> +#if defined(__FreeBSD__) +#include <linux/delay.h> +#ifdef DEBUG +#include <linux/seq_file.h> +#endif +#endif #include <brcmu_utils.h> #include <brcmu_wifi.h> @@ -429,7 +435,11 @@ static void brcmf_msgbuf_release_pktids(struct brcmf_msgbuf *msgbuf) static int brcmf_msgbuf_tx_ioctl(struct brcmf_pub *drvr, int ifidx, +#if defined(__linux__) uint cmd, void *buf, uint len) +#elif defined(__FreeBSD__) + uint cmd, const void *buf, uint len) +#endif { struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; struct brcmf_commonring *commonring; @@ -836,7 +846,11 @@ brcmf_msgbuf_configure_addr_mode(struct brcmf_pub *drvr, int ifidx, static void +#if defined(__linux__) brcmf_msgbuf_delete_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN]) +#elif defined(__FreeBSD__) +brcmf_msgbuf_delete_peer(struct brcmf_pub *drvr, int ifidx, const u8 peer[ETH_ALEN]) +#endif { struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; @@ -845,7 +859,11 @@ brcmf_msgbuf_delete_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN]) static void +#if defined(__linux__) brcmf_msgbuf_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN]) +#elif defined(__FreeBSD__) +brcmf_msgbuf_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, const u8 peer[ETH_ALEN]) +#endif { struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; @@ -904,7 +922,11 @@ static u32 brcmf_msgbuf_rxbuf_data_post(struct brcmf_msgbuf *msgbuf, u32 count) { struct brcmf_pub *drvr = msgbuf->drvr; struct brcmf_commonring *commonring; +#if defined(__linux__) void *ret_ptr; +#elif defined(__FreeBSD__) + u8 *ret_ptr; +#endif struct sk_buff *skb; u16 alloced; u32 pktlen; @@ -1012,7 +1034,11 @@ brcmf_msgbuf_rxbuf_ctrl_post(struct brcmf_msgbuf *msgbuf, bool event_buf, { struct brcmf_pub *drvr = msgbuf->drvr; struct brcmf_commonring *commonring; +#if defined(__linux__) void *ret_ptr; +#elif defined(__FreeBSD__) + u8 *ret_ptr; +#endif struct sk_buff *skb; u16 alloced; u32 pktlen; @@ -1337,7 +1363,11 @@ static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) static void brcmf_msgbuf_process_rx(struct brcmf_msgbuf *msgbuf, struct brcmf_commonring *commonring) { +#if defined(__linux__) void *buf; +#elif defined(__FreeBSD__) + u8 *buf; +#endif u16 count; u16 processed; @@ -1621,7 +1651,11 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr) do { brcmf_msgbuf_rxbuf_data_fill(msgbuf); if (msgbuf->max_rxbufpost != msgbuf->rxbufpost) +#if defined(__linux__) msleep(10); +#elif defined(__FreeBSD__) + linux_msleep(10); +#endif else break; count++; diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/p2p.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/p2p.c index 0dc9d28cd77b..e34ba5756af1 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/p2p.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/p2p.c @@ -7,6 +7,9 @@ #include <linux/etherdevice.h> #include <linux/rtnetlink.h> #include <net/cfg80211.h> +#if defined(__FreeBSD__) +#include <linux/delay.h> +#endif #include <brcmu_wifi.h> #include <brcmu_utils.h> @@ -1200,7 +1203,11 @@ static s32 brcmf_p2p_af_searching_channel(struct brcmf_p2p_info *p2p) */ if (test_bit(BRCMF_VIF_STATUS_CONNECTED, &pri_vif->sme_state) || test_bit(BRCMF_VIF_STATUS_CONNECTING, &pri_vif->sme_state)) +#if defined(__linux__) msleep(P2P_DEFAULT_SLEEP_TIME_VSDB); +#elif defined(__FreeBSD__) + linux_msleep(P2P_DEFAULT_SLEEP_TIME_VSDB); +#endif } brcmf_dbg(TRACE, "Completed search/listen peer_chan=%d\n", @@ -1334,7 +1341,11 @@ brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg) * return true if recevied action frame is to be dropped. */ static bool +#if defined(__linux__) brcmf_p2p_gon_req_collision(struct brcmf_p2p_info *p2p, u8 *mac) +#elif defined(__FreeBSD__) +brcmf_p2p_gon_req_collision(struct brcmf_p2p_info *p2p, const u8 *mac) +#endif { struct brcmf_cfg80211_info *cfg = p2p->cfg; struct brcmf_if *ifp; @@ -1422,7 +1433,11 @@ int brcmf_p2p_notify_action_frame_rx(struct brcmf_if *ifp, act_frm = (struct brcmf_p2p_pub_act_frame *)frame; action = act_frm->subtype; if ((action == P2P_PAF_GON_REQ) && +#if defined(__linux__) (brcmf_p2p_gon_req_collision(p2p, (u8 *)e->addr))) { +#elif defined(__FreeBSD__) + (brcmf_p2p_gon_req_collision(p2p, e->addr))) { +#endif if (test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status) && (ether_addr_equal(afx_hdl->tx_dst_addr, e->addr))) { @@ -1803,7 +1818,11 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg, */ if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->sme_state)) +#if defined(__linux__) msleep(50); +#elif defined(__FreeBSD__) + linux_msleep(50); +#endif /* if scan is ongoing, abort current scan. */ if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) @@ -1855,7 +1874,11 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg, (!ack) && (tx_retry < P2P_AF_TX_MAX_RETRY) && !dwell_overflow) { if (af_params->channel) +#if defined(__linux__) msleep(P2P_AF_RETRY_DELAY_TIME); +#elif defined(__FreeBSD__) + linux_msleep(P2P_AF_RETRY_DELAY_TIME); +#endif ack = !brcmf_p2p_tx_action_frame(p2p, af_params); tx_retry++; diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pcie.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pcie.c index 6327f4eca500..a759401ecf86 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pcie.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pcie.c @@ -467,10 +467,18 @@ static void brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active); static void brcmf_pcie_debugfs_create(struct device *dev); +#if defined(__FreeBSD__) +#define VPAA(_x, _a) (void __iomem *)((uintptr_t)(_x) + (_a)) +#endif + static u16 brcmf_pcie_read_reg16(struct brcmf_pciedev_info *devinfo, u32 reg_offset) { +#if defined(__linux__) void __iomem *address = devinfo->regs + reg_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->regs, reg_offset); +#endif return ioread16(address); } @@ -478,7 +486,11 @@ brcmf_pcie_read_reg16(struct brcmf_pciedev_info *devinfo, u32 reg_offset) static u32 brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset) { +#if defined(__linux__) void __iomem *address = devinfo->regs + reg_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->regs, reg_offset); +#endif return (ioread32(address)); } @@ -488,7 +500,11 @@ static void brcmf_pcie_write_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset, u32 value) { +#if defined(__linux__) void __iomem *address = devinfo->regs + reg_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->regs, reg_offset); +#endif iowrite32(value, address); } @@ -497,7 +513,11 @@ brcmf_pcie_write_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset, static u8 brcmf_pcie_read_tcm8(struct brcmf_pciedev_info *devinfo, u32 mem_offset) { +#if defined(__linux__) void __iomem *address = devinfo->tcm + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->tcm, mem_offset); +#endif return (ioread8(address)); } @@ -506,7 +526,11 @@ brcmf_pcie_read_tcm8(struct brcmf_pciedev_info *devinfo, u32 mem_offset) static u16 brcmf_pcie_read_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset) { +#if defined(__linux__) void __iomem *address = devinfo->tcm + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->tcm, mem_offset); +#endif return (ioread16(address)); } @@ -516,7 +540,11 @@ static void brcmf_pcie_write_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset, u16 value) { +#if defined(__linux__) void __iomem *address = devinfo->tcm + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->tcm, mem_offset); +#endif iowrite16(value, address); } @@ -525,7 +553,11 @@ brcmf_pcie_write_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset, static u16 brcmf_pcie_read_idx(struct brcmf_pciedev_info *devinfo, u32 mem_offset) { +#if defined(__linux__) u16 *address = devinfo->idxbuf + mem_offset; +#elif defined(__FreeBSD__) + u16 *address = (void *)((uintptr_t)devinfo->idxbuf + mem_offset); +#endif return (*(address)); } @@ -535,7 +567,11 @@ static void brcmf_pcie_write_idx(struct brcmf_pciedev_info *devinfo, u32 mem_offset, u16 value) { +#if defined(__linux__) u16 *address = devinfo->idxbuf + mem_offset; +#elif defined(__FreeBSD__) + u16 *address = (void *)((uintptr_t)devinfo->idxbuf + mem_offset); +#endif *(address) = value; } @@ -544,7 +580,11 @@ brcmf_pcie_write_idx(struct brcmf_pciedev_info *devinfo, u32 mem_offset, static u32 brcmf_pcie_read_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset) { +#if defined(__linux__) void __iomem *address = devinfo->tcm + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->tcm, mem_offset); +#endif return (ioread32(address)); } @@ -554,7 +594,11 @@ static void brcmf_pcie_write_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset, u32 value) { +#if defined(__linux__) void __iomem *address = devinfo->tcm + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *address = VPAA(devinfo->tcm, mem_offset); +#endif iowrite32(value, address); } @@ -563,7 +607,11 @@ brcmf_pcie_write_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset, static u32 brcmf_pcie_read_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset) { +#if defined(__linux__) void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *addr = VPAA(devinfo->tcm, devinfo->ci->rambase + mem_offset); +#endif return (ioread32(addr)); } @@ -573,7 +621,11 @@ static void brcmf_pcie_write_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset, u32 value) { +#if defined(__linux__) void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset; +#elif defined(__FreeBSD__) + void __iomem *addr = VPAA(devinfo->tcm, devinfo->ci->rambase + mem_offset); +#endif iowrite32(value, addr); } @@ -583,7 +635,11 @@ static void brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset, void *dstaddr, u32 len) { +#if defined(__linux__) void __iomem *address = devinfo->tcm + mem_offset; +#elif defined(__FreeBSD__) + u8 __iomem *address = (void *)((uintptr_t)devinfo->tcm + mem_offset); +#endif __le32 *dst32; __le16 *dst16; u8 *dst8; @@ -687,7 +743,11 @@ static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo) /* Watchdog reset */ brcmf_pcie_select_core(devinfo, BCMA_CORE_CHIPCOMMON); WRITECC32(devinfo, watchdog, 4); +#if defined(__linux__) msleep(100); +#elif defined(__FreeBSD__) + linux_msleep(100); +#endif /* Restore ASPM */ brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2); @@ -778,7 +838,11 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data) i = 0; while (cur_htod_mb_data != 0) { +#if defined(__linux__) msleep(10); +#elif defined(__FreeBSD__) + linux_msleep(10); +#endif i++; if (i > 100) return -EIO; @@ -1001,10 +1065,18 @@ static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo) free_irq(pdev->irq, devinfo); pci_disable_msi(pdev); +#if defined(__linux__) msleep(50); +#elif defined(__FreeBSD__) + linux_msleep(50); +#endif count = 0; while ((devinfo->in_irq) && (count < 20)) { +#if defined(__linux__) msleep(50); +#elif defined(__FreeBSD__) + linux_msleep(50); +#endif count++; } if (devinfo->in_irq) @@ -1234,7 +1306,11 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo) u16 max_submissionrings; u16 max_completionrings; +#if defined(__linux__) memcpy_fromio(&ringinfo, devinfo->tcm + devinfo->shared.ring_info_addr, +#elif defined(__FreeBSD__) + memcpy_fromio(&ringinfo, (void *)((uintptr_t)devinfo->tcm + devinfo->shared.ring_info_addr), +#endif sizeof(ringinfo)); if (devinfo->shared.version >= 6) { max_submissionrings = le16_to_cpu(ringinfo.max_submissionrings); @@ -1308,7 +1384,11 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo) ringinfo.d2h_r_idx_hostaddr.high_addr = cpu_to_le32(address >> 32); +#if defined(__linux__) memcpy_toio(devinfo->tcm + devinfo->shared.ring_info_addr, +#elif defined(__FreeBSD__) + memcpy_toio((void *)((uintptr_t)devinfo->tcm + devinfo->shared.ring_info_addr), +#endif &ringinfo, sizeof(ringinfo)); brcmf_dbg(PCIE, "Using host memory indices\n"); } @@ -1593,16 +1673,28 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { static void +#if defined(__linux__) brcmf_pcie_adjust_ramsize(struct brcmf_pciedev_info *devinfo, u8 *data, +#elif defined(__FreeBSD__) +brcmf_pcie_adjust_ramsize(struct brcmf_pciedev_info *devinfo, const u8 *data, +#endif u32 data_len) { +#if defined(__linux__) __le32 *field; +#elif defined(__FreeBSD__) + const __le32 *field; +#endif u32 newsize; if (data_len < BRCMF_RAMSIZE_OFFSET + 8) return; +#if defined(__linux__) field = (__le32 *)&data[BRCMF_RAMSIZE_OFFSET]; +#elif defined(__FreeBSD__) + field = (const __le32 *)&data[BRCMF_RAMSIZE_OFFSET]; +#endif if (le32_to_cpup(field) != BRCMF_RAMSIZE_MAGIC) return; field++; @@ -1683,7 +1775,11 @@ brcmf_pcie_provide_random_bytes(struct brcmf_pciedev_info *devinfo, u32 address) u8 randbuf[BRCMF_RANDOM_SEED_LENGTH]; get_random_bytes(randbuf, BRCMF_RANDOM_SEED_LENGTH); +#if defined(__linux__) memcpy_toio(devinfo->tcm + address, randbuf, BRCMF_RANDOM_SEED_LENGTH); +#elif defined(__FreeBSD__) + memcpy_toio((void *)((uintptr_t)devinfo->tcm + address), randbuf, BRCMF_RANDOM_SEED_LENGTH); +#endif } static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, @@ -1704,8 +1800,13 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, return err; brcmf_dbg(PCIE, "Download FW %s\n", devinfo->fw_name); +#if defined(__linux__) memcpy_toio(devinfo->tcm + devinfo->ci->rambase, (void *)fw->data, fw->size); +#elif defined(__FreeBSD__) + memcpy_toio((void *)((uintptr_t)devinfo->tcm + devinfo->ci->rambase), + fw->data, fw->size); +#endif resetintr = get_unaligned_le32(fw->data); release_firmware(fw); @@ -1719,7 +1820,11 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name); address = devinfo->ci->rambase + devinfo->ci->ramsize - nvram_len; +#if defined(__linux__) memcpy_toio(devinfo->tcm + address, nvram, nvram_len); +#elif defined(__FreeBSD__) + memcpy_toio((void *)((uintptr_t)devinfo->tcm + address), nvram, nvram_len); +#endif brcmf_fw_nvram_free(nvram); if (devinfo->fwseed) { @@ -1735,7 +1840,11 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, brcmf_dbg(PCIE, "Download random seed\n"); address -= sizeof(footer); +#if defined(__linux__) memcpy_toio(devinfo->tcm + address, &footer, +#elif defined(__FreeBSD__) + memcpy_toio((void *)((uintptr_t)devinfo->tcm + address), &footer, +#endif sizeof(footer)); address -= rand_len; @@ -1758,7 +1867,11 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, sharedram_addr = sharedram_addr_written; loop_counter = BRCMF_PCIE_FW_UP_TIMEOUT / 50; while ((sharedram_addr == sharedram_addr_written) && (loop_counter)) { +#if defined(__linux__) msleep(50); +#elif defined(__FreeBSD__) + linux_msleep(50); +#endif sharedram_addr = brcmf_pcie_read_ram32(devinfo, devinfo->ci->ramsize - 4); @@ -2173,7 +2286,11 @@ static void brcmf_pcie_setup(struct device *dev, int ret, * the device is shared and the devision is determined by FW. Parse * the firmware and adjust the chip memory size now. */ +#if defined(__linux__) brcmf_pcie_adjust_ramsize(devinfo, (u8 *)fw->data, fw->size); +#elif defined(__FreeBSD__) + brcmf_pcie_adjust_ramsize(devinfo, fw->data, fw->size); +#endif ret = brcmf_pcie_download_fw_nvram(devinfo, fw, nvram, nvram_len); if (ret) diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pno.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pno.c index 05f66ab13bed..3d5fc69a98fd 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pno.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/pno.c @@ -44,7 +44,11 @@ static int brcmf_pno_store_request(struct brcmf_pno_info *pi, "pno request storage full\n")) return -ENOSPC; +#if defined(__linux__) brcmf_dbg(SCAN, "reqid=%llu\n", req->reqid); +#elif defined(__FreeBSD__) + brcmf_dbg(SCAN, "reqid=%ju\n", (uintmax_t)req->reqid); +#endif mutex_lock(&pi->req_lock); pi->reqs[pi->n_reqs++] = req; mutex_unlock(&pi->req_lock); @@ -72,7 +76,11 @@ static int brcmf_pno_remove_request(struct brcmf_pno_info *pi, u64 reqid) goto done; } +#if defined(__linux__) brcmf_dbg(SCAN, "reqid=%llu\n", reqid); +#elif defined(__FreeBSD__) + brcmf_dbg(SCAN, "reqid=%ju\n", (uintmax_t)reqid); +#endif pi->n_reqs--; /* if last we are done */ @@ -184,8 +192,13 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi) /* Set locally administered */ pfn_mac.mac[0] |= 0x02; +#if defined(__linux__) brcmf_dbg(SCAN, "enabling random mac: reqid=%llu mac=%pM\n", pi->reqs[ri]->reqid, pfn_mac.mac); +#elif defined(__FreeBSD__) + brcmf_dbg(SCAN, "enabling random mac: reqid=%ju mac=%6D\n", + (uintmax_t)pi->reqs[ri]->reqid, pfn_mac.mac, ":"); +#endif err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac, sizeof(pfn_mac)); if (err) @@ -470,7 +483,11 @@ int brcmf_pno_start_sched_scan(struct brcmf_if *ifp, struct brcmf_pno_info *pi; int ret; +#if defined(__linux__) brcmf_dbg(TRACE, "reqid=%llu\n", req->reqid); +#elif defined(__FreeBSD__) + brcmf_dbg(TRACE, "reqid=%ju\n", (uintmax_t)req->reqid); +#endif pi = ifp_to_pno(ifp); ret = brcmf_pno_store_request(pi, req); @@ -492,7 +509,11 @@ int brcmf_pno_stop_sched_scan(struct brcmf_if *ifp, u64 reqid) struct brcmf_pno_info *pi; int err; +#if defined(__linux__) brcmf_dbg(TRACE, "reqid=%llu\n", reqid); +#elif defined(__FreeBSD__) + brcmf_dbg(TRACE, "reqid=%ju\n", (uintmax_t)reqid); +#endif pi = ifp_to_pno(ifp); diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/proto.h b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/proto.h index bd08d3aaa8f4..b2585407caad 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/proto.h +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/proto.h @@ -29,9 +29,17 @@ struct brcmf_proto { void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx, enum proto_addr_mode addr_mode); void (*delete_peer)(struct brcmf_pub *drvr, int ifidx, +#if defined(__linux__) u8 peer[ETH_ALEN]); +#elif defined(__FreeBSD__) + const u8 peer[ETH_ALEN]); +#endif void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx, +#if defined(__linux__) u8 peer[ETH_ALEN]); +#elif defined(__FreeBSD__) + const u8 peer[ETH_ALEN]); +#endif void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb); void (*add_if)(struct brcmf_if *ifp); void (*del_if)(struct brcmf_if *ifp); @@ -91,12 +99,20 @@ brcmf_proto_configure_addr_mode(struct brcmf_pub *drvr, int ifidx, drvr->proto->configure_addr_mode(drvr, ifidx, addr_mode); } static inline void +#if defined(__linux__) brcmf_proto_delete_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN]) +#elif defined(__FreeBSD__) +brcmf_proto_delete_peer(struct brcmf_pub *drvr, int ifidx, const u8 peer[ETH_ALEN]) +#endif { drvr->proto->delete_peer(drvr, ifidx, peer); } static inline void +#if defined(__linux__) brcmf_proto_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN]) +#elif defined(__FreeBSD__) +brcmf_proto_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, const u8 peer[ETH_ALEN]) +#endif { drvr->proto->add_tdls_peer(drvr, ifidx, peer); } diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/tracepoint.h b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/tracepoint.h index 96032322b165..8baea01f5125 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/tracepoint.h +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/tracepoint.h @@ -63,6 +63,7 @@ TRACE_EVENT(brcmf_dbg, TP_printk("%s: %s", __get_str(func), __get_str(msg)) ); +#if defined(__linux__) TRACE_EVENT(brcmf_hexdump, TP_PROTO(void *data, size_t len), TP_ARGS(data, len), @@ -78,6 +79,23 @@ TRACE_EVENT(brcmf_hexdump, ), TP_printk("hexdump [addr=%lx, length=%lu]", __entry->addr, __entry->len) ); +#elif defined(__FreeBSD__) +TRACE_EVENT(brcmf_hexdump, + TP_PROTO(const void *data, size_t len), + TP_ARGS(data, len), + TP_STRUCT__entry( + __field(unsigned long, len) + __field(unsigned long, addr) + __dynamic_array(u8, hdata, len) + ), + TP_fast_assign( + __entry->len = len; + __entry->addr = (unsigned long)data; + memcpy(__get_dynamic_array(hdata), data, len); + ), + TP_printk("hexdump [addr=%lx, length=%lu]", __entry->addr, __entry->len) +); +#endif TRACE_EVENT(brcmf_bcdchdr, TP_PROTO(void *data), diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/vendor.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/vendor.c index d07e7c7355d9..65aabbc81f9b 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/vendor.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/vendor.c @@ -60,8 +60,13 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy, if (NULL == dcmd_buf) return -ENOMEM; +#if defined(__linux__) memcpy(dcmd_buf, (void *)cmdhdr + cmdhdr->offset, len); *(char *)(dcmd_buf + len) = '\0'; +#elif defined(__FreeBSD__) + memcpy(dcmd_buf, (void *)((uintptr_t)cmdhdr + cmdhdr->offset), len); + *(char *)((uintptr_t)dcmd_buf + len) = '\0'; +#endif } if (cmdhdr->set) @@ -95,7 +100,11 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy, if (ret) break; +#if defined(__linux__) wr_pointer += msglen; +#elif defined(__FreeBSD__) + wr_pointer = (void *)((uintptr_t)wr_pointer + msglen); +#endif } exit: diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/xtlv.c b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/xtlv.c index 08841b9a5b81..a2fc257e1bfa 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmfmac/xtlv.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmfmac/xtlv.c @@ -8,6 +8,10 @@ #include <linux/math.h> #include <linux/string.h> #include <linux/bug.h> +#if defined(__FreeBSD__) +#include <linux/kernel.h> +#include <asm/unaligned.h> +#endif #include "xtlv.h" diff --git a/sys/contrib/dev/broadcom/brcm80211/brcmutil/utils.c b/sys/contrib/dev/broadcom/brcm80211/brcmutil/utils.c index fe94db0ba3f3..253a3c92cadf 100644 --- a/sys/contrib/dev/broadcom/brcm80211/brcmutil/utils.c +++ b/sys/contrib/dev/broadcom/brcm80211/brcmutil/utils.c @@ -7,12 +7,21 @@ #include <linux/netdevice.h> #include <linux/module.h> +#if defined(__FreeBSD__) +#ifdef DEBUG +#include <linux/printk.h> +#endif +#endif #include <brcmu_utils.h> MODULE_AUTHOR("Broadcom Corporation"); MODULE_DESCRIPTION("Broadcom 802.11n wireless LAN driver utilities."); MODULE_LICENSE("Dual BSD/GPL"); +#if defined(__FreeBSD__) +MODULE_VERSION(brcmutil, 1); +MODULE_DEPEND(brcmutil, linuxkpi, 1, 1, 1); +#endif struct sk_buff *brcmu_pkt_buf_get_skb(uint len) { |
