mac80211: brcmfmac: backport important changes from the 4.19
authorRafał Miłecki <rafal@milecki.pl>
Thu, 16 Aug 2018 09:38:30 +0000 (11:38 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Thu, 16 Aug 2018 11:15:06 +0000 (13:15 +0200)
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
package/kernel/mac80211/Makefile
package/kernel/mac80211/patches/332-v4.19-0001-brcmfmac-detect-firmware-support-for-monitor-interfa.patch [new file with mode: 0644]
package/kernel/mac80211/patches/332-v4.19-0002-brcmfmac-detect-firmware-support-for-radiotap-monito.patch [new file with mode: 0644]
package/kernel/mac80211/patches/332-v4.19-0003-brcmfmac-handle-msgbuf-packets-marked-with-monitor-m.patch [new file with mode: 0644]
package/kernel/mac80211/patches/332-v4.19-0004-brcmfmac-define-more-bits-for-the-flags-of-struct-br.patch [new file with mode: 0644]
package/kernel/mac80211/patches/332-v4.19-0005-brcmfmac-update-STA-info-struct-to-the-v5.patch [new file with mode: 0644]
package/kernel/mac80211/patches/332-v4.19-0006-brcmfmac-specify-some-features-per-firmware-version.patch [new file with mode: 0644]
package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch

index 1119ccf..e6b0793 100644 (file)
@@ -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
diff --git a/package/kernel/mac80211/patches/332-v4.19-0001-brcmfmac-detect-firmware-support-for-monitor-interfa.patch b/package/kernel/mac80211/patches/332-v4.19-0001-brcmfmac-detect-firmware-support-for-monitor-interfa.patch
new file mode 100644 (file)
index 0000000..c754bd2
--- /dev/null
@@ -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:
diff --git a/package/kernel/mac80211/patches/332-v4.19-0002-brcmfmac-detect-firmware-support-for-radiotap-monito.patch b/package/kernel/mac80211/patches/332-v4.19-0002-brcmfmac-detect-firmware-support-for-radiotap-monito.patch
new file mode 100644 (file)
index 0000000..1b62325
--- /dev/null
@@ -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:
diff --git a/package/kernel/mac80211/patches/332-v4.19-0003-brcmfmac-handle-msgbuf-packets-marked-with-monitor-m.patch b/package/kernel/mac80211/patches/332-v4.19-0003-brcmfmac-handle-msgbuf-packets-marked-with-monitor-m.patch
new file mode 100644 (file)
index 0000000..84f24b3
--- /dev/null
@@ -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",
diff --git a/package/kernel/mac80211/patches/332-v4.19-0004-brcmfmac-define-more-bits-for-the-flags-of-struct-br.patch b/package/kernel/mac80211/patches/332-v4.19-0004-brcmfmac-define-more-bits-for-the-flags-of-struct-br.patch
new file mode 100644 (file)
index 0000000..050370d
--- /dev/null
@@ -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
diff --git a/package/kernel/mac80211/patches/332-v4.19-0005-brcmfmac-update-STA-info-struct-to-the-v5.patch b/package/kernel/mac80211/patches/332-v4.19-0005-brcmfmac-update-STA-info-struct-to-the-v5.patch
new file mode 100644 (file)
index 0000000..fed5873
--- /dev/null
@@ -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 {
diff --git a/package/kernel/mac80211/patches/332-v4.19-0006-brcmfmac-specify-some-features-per-firmware-version.patch b/package/kernel/mac80211/patches/332-v4.19-0006-brcmfmac-specify-some-features-per-firmware-version.patch
new file mode 100644 (file)
index 0000000..04836f8
--- /dev/null
@@ -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:
index 90f5adb..d86f06a 100644 (file)
@@ -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;