mirror of
https://github.com/openwrt/openwrt.git
synced 2025-03-10 14:34:13 +00:00
mac80211: brcmfmac: backport important changes from the 4.19
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
9d8940c5b9
commit
0c76265d08
@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2017-01-31
|
||||
PKG_RELEASE:=12
|
||||
PKG_RELEASE:=13
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
PKG_BACKPORT_VERSION:=
|
||||
PKG_HASH:=75e6d39e34cf156212a2509172a4a62b673b69eb4a1d9aaa565f7fa719fa2317
|
||||
|
@ -0,0 +1,59 @@
|
||||
From 01f69dfafdbe7deff58b58053bc3a4a75c6a570c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 24 Jun 2018 21:44:35 +0200
|
||||
Subject: [PATCH] brcmfmac: detect firmware support for monitor interface
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Many/most of firmwares support creating monitor interface but only the
|
||||
most recent ones explicitly /announce/ it using a "monitor" entry in the
|
||||
list of capabilities.
|
||||
|
||||
Check for that entry and store internally info about monitor mode
|
||||
support using a new feature flag. Once we sort out all details of
|
||||
handling monitor interface it will be used when reporting available
|
||||
interfaces to the cfg80211.
|
||||
|
||||
Later some fallback detecion method may be added for older firmwares.
|
||||
For now just stick to the "monitor" capability which should be 100%
|
||||
reliable.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h | 4 +++-
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -47,6 +47,7 @@ static const struct brcmf_feat_fwcap brc
|
||||
{ BRCMF_FEAT_MBSS, "mbss" },
|
||||
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||
{ BRCMF_FEAT_P2P, "p2p" },
|
||||
+ { BRCMF_FEAT_MONITOR, "monitor" },
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -31,6 +31,7 @@
|
||||
* WOWL_GTK: (WOWL) GTK rekeying offload
|
||||
* WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL.
|
||||
* MFP: 802.11w Management Frame Protection.
|
||||
+ * MONITOR: firmware can pass monitor packets to host.
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -44,7 +45,8 @@
|
||||
BRCMF_FEAT_DEF(WOWL_ND) \
|
||||
BRCMF_FEAT_DEF(WOWL_GTK) \
|
||||
BRCMF_FEAT_DEF(WOWL_ARP_ND) \
|
||||
- BRCMF_FEAT_DEF(MFP)
|
||||
+ BRCMF_FEAT_DEF(MFP) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR)
|
||||
|
||||
/*
|
||||
* Quirks:
|
@ -0,0 +1,51 @@
|
||||
From e63410ac65e0ead2040bbd3927c116889edf87e4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 24 Jun 2018 21:44:36 +0200
|
||||
Subject: [PATCH] brcmfmac: detect firmware support for radiotap monitor frames
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Depending on used build-time options some firmwares may already include
|
||||
radiotap header in passed monitor frames. Add a new feature flag to
|
||||
store info about it. It's needed for proper handling of received frames
|
||||
before passing them up.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h | 4 +++-
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -48,6 +48,7 @@ static const struct brcmf_feat_fwcap brc
|
||||
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||
{ BRCMF_FEAT_P2P, "p2p" },
|
||||
{ BRCMF_FEAT_MONITOR, "monitor" },
|
||||
+ { BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -32,6 +32,7 @@
|
||||
* WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL.
|
||||
* MFP: 802.11w Management Frame Protection.
|
||||
* MONITOR: firmware can pass monitor packets to host.
|
||||
+ * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -46,7 +47,8 @@
|
||||
BRCMF_FEAT_DEF(WOWL_GTK) \
|
||||
BRCMF_FEAT_DEF(WOWL_ARP_ND) \
|
||||
BRCMF_FEAT_DEF(MFP) \
|
||||
- BRCMF_FEAT_DEF(MONITOR)
|
||||
+ BRCMF_FEAT_DEF(MONITOR) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP)
|
||||
|
||||
/*
|
||||
* Quirks:
|
@ -0,0 +1,141 @@
|
||||
From a8d7631858aff156b72f807ee7cc062048e63836 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Sun, 24 Jun 2018 21:44:37 +0200
|
||||
Subject: [PATCH] brcmfmac: handle msgbuf packets marked with monitor mode flag
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
New Broadcom firmwares mark monitor mode packets using a newly defined
|
||||
bit in the flags field. Use it to filter them out and pass to the
|
||||
monitor interface. These defines were found in bcmmsgbuf.h from SDK.
|
||||
|
||||
As not every firmware generates radiotap header this commit introduces
|
||||
BRCMF_FEAT_MONITOR_FMT_RADIOTAP flag. It has to be has based on firmware
|
||||
capabilities. If not present brcmf_netif_mon_rx() will assume packet is
|
||||
a raw 802.11 frame and will prepend it with an empty radiotap header.
|
||||
|
||||
This new code is limited to the msgbuf protocol at this point. Adding
|
||||
support for SDIO/USB devices will require some extra work (possibly a
|
||||
new firmware release).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 25 ++++++++++++++++++++++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 ++
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 18 ++++++++++++++++
|
||||
3 files changed, 45 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <net/cfg80211.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/addrconf.h>
|
||||
+#include <net/ieee80211_radiotap.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <brcmu_utils.h>
|
||||
#include <brcmu_wifi.h>
|
||||
@@ -367,6 +368,34 @@ void brcmf_netif_rx(struct brcmf_if *ifp
|
||||
netif_rx_ni(skb);
|
||||
}
|
||||
|
||||
+void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||
+{
|
||||
+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_RADIOTAP)) {
|
||||
+ /* Do nothing */
|
||||
+ } else {
|
||||
+ struct ieee80211_radiotap_header *radiotap;
|
||||
+
|
||||
+ /* TODO: use RX status to fill some radiotap data */
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0)
|
||||
+ radiotap = skb_push(skb, sizeof(*radiotap));
|
||||
+#else
|
||||
+ radiotap = (struct ieee80211_radiotap_header *)skb_push(skb, sizeof(*radiotap));
|
||||
+#endif
|
||||
+ memset(radiotap, 0, sizeof(*radiotap));
|
||||
+ radiotap->it_len = cpu_to_le16(sizeof(*radiotap));
|
||||
+
|
||||
+ /* TODO: 4 bytes with receive status? */
|
||||
+ skb->len -= 4;
|
||||
+ }
|
||||
+
|
||||
+ skb->dev = ifp->ndev;
|
||||
+ skb_reset_mac_header(skb);
|
||||
+ skb->pkt_type = PACKET_OTHERHOST;
|
||||
+ skb->protocol = htons(ETH_P_802_2);
|
||||
+
|
||||
+ brcmf_netif_rx(ifp, skb);
|
||||
+}
|
||||
+
|
||||
static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb,
|
||||
struct brcmf_if **ifp)
|
||||
{
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -121,6 +121,7 @@ struct brcmf_pub {
|
||||
|
||||
struct brcmf_if *iflist[BRCMF_MAX_IFS];
|
||||
s32 if2bss[BRCMF_MAX_IFS];
|
||||
+ struct brcmf_if *mon_if;
|
||||
|
||||
struct mutex proto_block;
|
||||
unsigned char proto_buf[BRCMF_DCMD_MAXLEN];
|
||||
@@ -215,6 +216,7 @@ void brcmf_txflowblock_if(struct brcmf_i
|
||||
enum brcmf_netif_stop_reason reason, bool state);
|
||||
void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
|
||||
void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
+void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
|
||||
int __init brcmf_core_init(void);
|
||||
void __exit brcmf_core_exit(void);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -69,6 +69,8 @@
|
||||
#define BRCMF_MSGBUF_MAX_EVENTBUF_POST 8
|
||||
|
||||
#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_3 0x01
|
||||
+#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_11 0x02
|
||||
+#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_MASK 0x07
|
||||
#define BRCMF_MSGBUF_PKT_FLAGS_PRIO_SHIFT 5
|
||||
|
||||
#define BRCMF_MSGBUF_TX_FLUSH_CNT1 32
|
||||
@@ -1126,6 +1128,7 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
struct sk_buff *skb;
|
||||
u16 data_offset;
|
||||
u16 buflen;
|
||||
+ u16 flags;
|
||||
u32 idx;
|
||||
struct brcmf_if *ifp;
|
||||
|
||||
@@ -1135,6 +1138,7 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
data_offset = le16_to_cpu(rx_complete->data_offset);
|
||||
buflen = le16_to_cpu(rx_complete->data_len);
|
||||
idx = le32_to_cpu(rx_complete->msg.request_id);
|
||||
+ flags = le16_to_cpu(rx_complete->flags);
|
||||
|
||||
skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
|
||||
msgbuf->rx_pktids, idx);
|
||||
@@ -1148,6 +1152,20 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
|
||||
skb_trim(skb, buflen);
|
||||
|
||||
+ if ((flags & BRCMF_MSGBUF_PKT_FLAGS_FRAME_MASK) ==
|
||||
+ BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_11) {
|
||||
+ ifp = msgbuf->drvr->mon_if;
|
||||
+
|
||||
+ if (!ifp) {
|
||||
+ brcmf_err("Received unexpected monitor pkt\n");
|
||||
+ brcmu_pkt_buf_free_skb(skb);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ brcmf_netif_mon_rx(ifp, skb);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
ifp = brcmf_get_ifp(msgbuf->drvr, rx_complete->msg.ifidx);
|
||||
if (!ifp || !ifp->ndev) {
|
||||
brcmf_err("Received pkt for invalid ifidx %d\n",
|
@ -0,0 +1,60 @@
|
||||
From 4b4a8d808c58fc0defc32a26b2fea35d66692c45 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 28 Jun 2018 08:16:13 +0200
|
||||
Subject: [PATCH] brcmfmac: define more bits for the flags of struct
|
||||
brcmf_sta_info_le
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
That struct is passed by a firmware when querying for STA info. Flags
|
||||
are used to indicate what info could be obtained.
|
||||
|
||||
These new defines may allow passing more info to the cfg80211 in the
|
||||
future. They had been obtained from Broadcom's SDK file wlioctl_defs.h
|
||||
used by DD-WRT.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/fwil_types.h | 29 ++++++++++++++++++----
|
||||
1 file changed, 24 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
@@ -32,11 +32,30 @@
|
||||
#define BRCMF_BSS_INFO_VERSION 109 /* curr ver of brcmf_bss_info_le struct */
|
||||
#define BRCMF_BSS_RSSI_ON_CHANNEL 0x0002
|
||||
|
||||
-#define BRCMF_STA_WME 0x00000002 /* WMM association */
|
||||
-#define BRCMF_STA_AUTHE 0x00000008 /* Authenticated */
|
||||
-#define BRCMF_STA_ASSOC 0x00000010 /* Associated */
|
||||
-#define BRCMF_STA_AUTHO 0x00000020 /* Authorized */
|
||||
-#define BRCMF_STA_SCBSTATS 0x00004000 /* Per STA debug stats */
|
||||
+#define BRCMF_STA_BRCM 0x00000001 /* Running a Broadcom driver */
|
||||
+#define BRCMF_STA_WME 0x00000002 /* WMM association */
|
||||
+#define BRCMF_STA_NONERP 0x00000004 /* No ERP */
|
||||
+#define BRCMF_STA_AUTHE 0x00000008 /* Authenticated */
|
||||
+#define BRCMF_STA_ASSOC 0x00000010 /* Associated */
|
||||
+#define BRCMF_STA_AUTHO 0x00000020 /* Authorized */
|
||||
+#define BRCMF_STA_WDS 0x00000040 /* Wireless Distribution System */
|
||||
+#define BRCMF_STA_WDS_LINKUP 0x00000080 /* WDS traffic/probes flowing properly */
|
||||
+#define BRCMF_STA_PS 0x00000100 /* STA is in power save mode from AP's viewpoint */
|
||||
+#define BRCMF_STA_APSD_BE 0x00000200 /* APSD delv/trigger for AC_BE is default enabled */
|
||||
+#define BRCMF_STA_APSD_BK 0x00000400 /* APSD delv/trigger for AC_BK is default enabled */
|
||||
+#define BRCMF_STA_APSD_VI 0x00000800 /* APSD delv/trigger for AC_VI is default enabled */
|
||||
+#define BRCMF_STA_APSD_VO 0x00001000 /* APSD delv/trigger for AC_VO is default enabled */
|
||||
+#define BRCMF_STA_N_CAP 0x00002000 /* STA 802.11n capable */
|
||||
+#define BRCMF_STA_SCBSTATS 0x00004000 /* Per STA debug stats */
|
||||
+#define BRCMF_STA_AMPDU_CAP 0x00008000 /* STA AMPDU capable */
|
||||
+#define BRCMF_STA_AMSDU_CAP 0x00010000 /* STA AMSDU capable */
|
||||
+#define BRCMF_STA_MIMO_PS 0x00020000 /* mimo ps mode is enabled */
|
||||
+#define BRCMF_STA_MIMO_RTS 0x00040000 /* send rts in mimo ps mode */
|
||||
+#define BRCMF_STA_RIFS_CAP 0x00080000 /* rifs enabled */
|
||||
+#define BRCMF_STA_VHT_CAP 0x00100000 /* STA VHT(11ac) capable */
|
||||
+#define BRCMF_STA_WPS 0x00200000 /* WPS state */
|
||||
+#define BRCMF_STA_DWDS_CAP 0x01000000 /* DWDS CAP */
|
||||
+#define BRCMF_STA_DWDS 0x02000000 /* DWDS active */
|
||||
|
||||
/* size of brcmf_scan_params not including variable length array */
|
||||
#define BRCMF_SCAN_PARAMS_FIXED_SIZE 64
|
@ -0,0 +1,75 @@
|
||||
From 07b1ae46874949252625c96f309f96ca0f337020 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 28 Jun 2018 12:36:23 +0200
|
||||
Subject: [PATCH] brcmfmac: update STA info struct to the v5
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
That struct is used when querying firmware for the STA. It seem is has
|
||||
been changing during the time. Luckily its format seems to be backward
|
||||
compatible starting with v2 (the only breakage was v1 -> v2).
|
||||
|
||||
The version that was supported by brcmfmac so far was v4. It was what
|
||||
43602a1 and 4366b1 firmwares (7.35.177.56 and 10.10.69.3309 accordingly)
|
||||
were using. It also seems to be used by early 4366c0 firmwares
|
||||
(10.10.69.6908 and 10.10.69.69017).
|
||||
|
||||
The problem appears when switching to the 10.10.122.20 firmware. It uses
|
||||
v5 and instead of falling back to v4 when submitted buffer isn't big
|
||||
enough it fallbacks to the v3.
|
||||
|
||||
To receive all v4 specific info with the newest firmware we have to
|
||||
submit a struct (buffer) that matches v5.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
@@ -165,6 +165,8 @@
|
||||
#define BRCMF_MFP_NONE 0
|
||||
#define BRCMF_MFP_CAPABLE 1
|
||||
#define BRCMF_MFP_REQUIRED 2
|
||||
+
|
||||
+#define BRCMF_VHT_CAP_MCS_MAP_NSS_MAX 8
|
||||
|
||||
/* join preference types for join_pref iovar */
|
||||
enum brcmf_join_pref_types {
|
||||
@@ -514,6 +516,8 @@ struct brcmf_sta_info_le {
|
||||
/* w/hi bit set if basic */
|
||||
__le32 in; /* seconds elapsed since associated */
|
||||
__le32 listen_interval_inms; /* Min Listen interval in ms for STA */
|
||||
+
|
||||
+ /* Fields valid for ver >= 3 */
|
||||
__le32 tx_pkts; /* # of packets transmitted */
|
||||
__le32 tx_failures; /* # of packets failed */
|
||||
__le32 rx_ucast_pkts; /* # of unicast packets received */
|
||||
@@ -522,6 +526,8 @@ struct brcmf_sta_info_le {
|
||||
__le32 rx_rate; /* Rate of last successful rx frame */
|
||||
__le32 rx_decrypt_succeeds; /* # of packet decrypted successfully */
|
||||
__le32 rx_decrypt_failures; /* # of packet decrypted failed */
|
||||
+
|
||||
+ /* Fields valid for ver >= 4 */
|
||||
__le32 tx_tot_pkts; /* # of tx pkts (ucast + mcast) */
|
||||
__le32 rx_tot_pkts; /* # of data packets recvd (uni + mcast) */
|
||||
__le32 tx_mcast_pkts; /* # of mcast pkts txed */
|
||||
@@ -558,6 +564,14 @@ struct brcmf_sta_info_le {
|
||||
*/
|
||||
__le32 rx_pkts_retried; /* # rx with retry bit set */
|
||||
__le32 tx_rate_fallback; /* lowest fallback TX rate */
|
||||
+
|
||||
+ /* Fields valid for ver >= 5 */
|
||||
+ struct {
|
||||
+ __le32 count; /* # rates in this set */
|
||||
+ u8 rates[BRCMF_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */
|
||||
+ u8 mcs[BRCMF_MCSSET_LEN]; /* supported mcs index bit map */
|
||||
+ __le16 vht_mcs[BRCMF_VHT_CAP_MCS_MAP_NSS_MAX]; /* supported mcs index bit map per nss */
|
||||
+ } rateset_adv;
|
||||
};
|
||||
|
||||
struct brcmf_chanspec_list {
|
@ -0,0 +1,84 @@
|
||||
From 1e591c56a65fbbcd5754a4210a0ef0402d5e5f33 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 9 Jul 2018 06:55:43 +0200
|
||||
Subject: [PATCH] brcmfmac: specify some features per firmware version
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Some features supported by firmware aren't advertised and there is no
|
||||
way for a driver to query them. This includes e.g. monitor mode details.
|
||||
|
||||
Most firmwares support monitor interface but only the latest ones
|
||||
/announce/ it with a "monitor" flag in the "cap" iovar. There isn't any
|
||||
reliable detection method for older firmwares (BRCMF_C_MONITOR was tried
|
||||
but "it only indicates the core part of the stack supports").
|
||||
|
||||
Similarly support for tagging monitor frames and building radiotap
|
||||
headers can't be reliably detected for all firmwares.
|
||||
|
||||
This commit adds table that allows mapping features to firmware version.
|
||||
It adds mappings for 43602a1 and 4366b1 firmwares from
|
||||
linux-firmware.git. Both were confirmed to be passing monitor frames.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/feature.c | 38 ++++++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -92,6 +92,42 @@ static int brcmf_feat_debugfs_read(struc
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
+struct brcmf_feat_fwfeat {
|
||||
+ const char * const fwid;
|
||||
+ u32 feat_flags;
|
||||
+};
|
||||
+
|
||||
+static const struct brcmf_feat_fwfeat brcmf_feat_fwfeat_map[] = {
|
||||
+ /* brcmfmac43602-pcie.ap.bin from linux-firmware.git commit ea1178515b88 */
|
||||
+ { "01-6cb8e269", BIT(BRCMF_FEAT_MONITOR) },
|
||||
+ /* brcmfmac4366b-pcie.bin from linux-firmware.git commit 52442afee990 */
|
||||
+ { "01-c47a91a4", BIT(BRCMF_FEAT_MONITOR) },
|
||||
+};
|
||||
+
|
||||
+static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv)
|
||||
+{
|
||||
+ const struct brcmf_feat_fwfeat *e;
|
||||
+ u32 feat_flags = 0;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(brcmf_feat_fwfeat_map); i++) {
|
||||
+ e = &brcmf_feat_fwfeat_map[i];
|
||||
+ if (!strcmp(e->fwid, drv->fwver)) {
|
||||
+ feat_flags = e->feat_flags;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!feat_flags)
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < BRCMF_FEAT_LAST; i++)
|
||||
+ if (feat_flags & BIT(i))
|
||||
+ brcmf_dbg(INFO, "enabling firmware feature: %s\n",
|
||||
+ brcmf_feat_names[i]);
|
||||
+ drv->feat_flags |= feat_flags;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* brcmf_feat_iovar_int_get() - determine feature through iovar query.
|
||||
*
|
||||
@@ -219,6 +255,8 @@ void brcmf_feat_attach(struct brcmf_pub
|
||||
ifp->drvr->feat_flags &= ~drvr->settings->feature_disable;
|
||||
}
|
||||
|
||||
+ brcmf_feat_firmware_overrides(drvr);
|
||||
+
|
||||
/* set chip related quirks */
|
||||
switch (drvr->bus_if->chip) {
|
||||
case BRCM_CC_43236_CHIP_ID:
|
@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1276,6 +1276,7 @@ int __init brcmf_core_init(void)
|
||||
@@ -1301,6 +1301,7 @@ int __init brcmf_core_init(void)
|
||||
{
|
||||
if (!schedule_work(&brcmf_driver_work))
|
||||
return -EBUSY;
|
||||
|
Loading…
x
Reference in New Issue
Block a user