aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2026-02-10 21:33:09 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2026-02-10 21:36:29 +0000
commit902136e0fe112383ec64d2ef43a446063b5e6417 (patch)
tree75536a6e2af0110ed0d7ed270a32d7d886ae3163 /sys/contrib
parentb4c3e9b5b09c829b4135aff738bd2893ed052377 (diff)
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/cfg80211.c190
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/common.c35
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/commonring.c15
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.c8
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/debug.h24
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/firmware.c24
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.c24
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/flowring.h8
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.c8
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwil.h4
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwvid.c18
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/msgbuf.c34
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/p2p.c23
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/pcie.c117
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/pno.c21
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/proto.h16
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/tracepoint.h18
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/vendor.c9
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmfmac/xtlv.c4
-rw-r--r--sys/contrib/dev/broadcom/brcm80211/brcmutil/utils.c9
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)
{