From: Rafał Miłecki Date: Thu, 16 Aug 2018 09:38:30 +0000 (+0200) Subject: mac80211: brcmfmac: backport important changes from the 4.19 X-Git-Tag: v17.01.6~21 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0c76265d0819e16a256707b8c357a4cdbb1464f3;p=oweals%2Fopenwrt.git mac80211: brcmfmac: backport important changes from the 4.19 Signed-off-by: Rafał Miłecki --- diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 1119ccf574..e6b0793018 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -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 index 0000000000..c754bd225b --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.19-0001-brcmfmac-detect-firmware-support-for-monitor-interfa.patch @@ -0,0 +1,59 @@ +From 01f69dfafdbe7deff58b58053bc3a4a75c6a570c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + 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 index 0000000000..1b62325330 --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.19-0002-brcmfmac-detect-firmware-support-for-radiotap-monito.patch @@ -0,0 +1,51 @@ +From e63410ac65e0ead2040bbd3927c116889edf87e4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + 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 index 0000000000..84f24b3b39 --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.19-0003-brcmfmac-handle-msgbuf-packets-marked-with-monitor-m.patch @@ -0,0 +1,141 @@ +From a8d7631858aff156b72f807ee7cc062048e63836 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../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 + #include + #include ++#include + #include + #include + #include +@@ -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 index 0000000000..050370de46 --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.19-0004-brcmfmac-define-more-bits-for-the-flags-of-struct-br.patch @@ -0,0 +1,60 @@ +From 4b4a8d808c58fc0defc32a26b2fea35d66692c45 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: Kalle Valo +--- + .../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 index 0000000000..fed5873e6d --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.19-0005-brcmfmac-update-STA-info-struct-to-the-v5.patch @@ -0,0 +1,75 @@ +From 07b1ae46874949252625c96f309f96ca0f337020 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../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 index 0000000000..04836f8215 --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.19-0006-brcmfmac-specify-some-features-per-firmware-version.patch @@ -0,0 +1,84 @@ +From 1e591c56a65fbbcd5754a4210a0ef0402d5e5f33 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Reviewed-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../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: diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch index 90f5adb0d1..d86f06ad80 100644 --- a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch +++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch @@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki --- 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;