mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
mac80211: fix ath9k/ath10k mesh mode support
This commit is contained in:
parent
c4ea749b20
commit
cca8bbc0b1
@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=4.19.7-1
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.7/
|
||||
PKG_HASH:=86650a02f36b0d39059be343d4bad3be14adece699723713a69c94cc64d456ef
|
||||
PKG_VERSION:=4.19.23-1
|
||||
PKG_RELEASE:=4
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.23/
|
||||
PKG_HASH:=703e940b542eb56067fcd847a7c69398dcc9829f34472647eea4211cb2ab3b83
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
|
||||
@ -98,6 +98,7 @@ define KernelPackage/cfg80211
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=cfg80211 - wireless configuration API
|
||||
DEPENDS+= +iw +wireless-regdb
|
||||
ABI_VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/compat/compat.ko \
|
||||
$(PKG_BUILD_DIR)/net/wireless/cfg80211.ko
|
||||
@ -115,6 +116,7 @@ define KernelPackage/mac80211
|
||||
KCONFIG:=\
|
||||
CONFIG_AVERAGE=y
|
||||
FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko
|
||||
ABI_VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
|
@ -113,7 +113,7 @@ detect_mac80211() {
|
||||
set wireless.radio${devidx}.hwmode=11${mode_band}
|
||||
${dev_id}
|
||||
${ht_capab}
|
||||
set wireless.radio${devidx}.disabled=1
|
||||
set wireless.radio${devidx}.disabled=0
|
||||
|
||||
set wireless.default_radio${devidx}=wifi-iface
|
||||
set wireless.default_radio${devidx}.device=radio${devidx}
|
||||
|
@ -81,7 +81,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
rate->flags |= IEEE80211_TX_RC_MCS;
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -2973,7 +2973,7 @@ int ath9k_tx99_send(struct ath_softc *sc
|
||||
@@ -2974,7 +2974,7 @@ int ath9k_tx99_send(struct ath_softc *sc
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -85,7 +85,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
rate->flags |= IEEE80211_TX_RC_MCS;
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -2973,7 +2973,7 @@ int ath9k_tx99_send(struct ath_softc *sc
|
||||
@@ -2974,7 +2974,7 @@ int ath9k_tx99_send(struct ath_softc *sc
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,35 @@
|
||||
From: Oever Gonzalez <notengobattery@gmail.com>
|
||||
Date: Mon, 7 Jan 2019 01:07:12 +0200
|
||||
Subject: [PATCH] ath: regd: add extra coutry codes
|
||||
|
||||
This patch adds several country codes to the regd.h and regd_common.h
|
||||
files in order to support devices whose country codes are not present in
|
||||
the original list. Without this patch, all devices whose manufacturer
|
||||
programmed any of these code in their EEPROM will not work.
|
||||
|
||||
Signed-off-by: Oever Gonzalez <notengobattery@gmail.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/regd.h
|
||||
+++ b/drivers/net/wireless/ath/regd.h
|
||||
@@ -185,7 +185,9 @@ enum CountryCode {
|
||||
CTRY_UKRAINE = 804,
|
||||
CTRY_UNITED_KINGDOM = 826,
|
||||
CTRY_UNITED_STATES = 840,
|
||||
+ CTRY_UNITED_STATES2 = 841,
|
||||
CTRY_UNITED_STATES_FCC49 = 842,
|
||||
+ CTRY_UNITED_STATES3 = 843,
|
||||
CTRY_URUGUAY = 858,
|
||||
CTRY_UZBEKISTAN = 860,
|
||||
CTRY_VENEZUELA = 862,
|
||||
--- a/drivers/net/wireless/ath/regd_common.h
|
||||
+++ b/drivers/net/wireless/ath/regd_common.h
|
||||
@@ -486,6 +486,8 @@ static struct country_code_to_enum_rd al
|
||||
{CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"},
|
||||
{CTRY_UNITED_STATES, FCC3_FCCA, "US"},
|
||||
{CTRY_UNITED_STATES, FCC3_FCCA_2, "US"},
|
||||
+ {CTRY_UNITED_STATES2, FCC3_FCCA, "US"},
|
||||
+ {CTRY_UNITED_STATES3, FCC3_FCCA, "US"},
|
||||
/* This "PS" is for US public safety actually... to support this we
|
||||
* would need to assign new special alpha2 to CRDA db as with the world
|
||||
* regdomain and use another alpha2 */
|
@ -1,18 +0,0 @@
|
||||
Index: backports-4.19.7-1/drivers/net/wireless/ath/regd.c
|
||||
===================================================================
|
||||
--- backports-4.19.7-1.orig/drivers/net/wireless/ath/regd.c
|
||||
+++ backports-4.19.7-1/drivers/net/wireless/ath/regd.c
|
||||
@@ -703,6 +703,12 @@ ath_regd_init_wiphy(struct ath_regulator
|
||||
*/
|
||||
static void ath_regd_sanitize(struct ath_regulatory *reg)
|
||||
{
|
||||
+ /*
|
||||
+ * This will sanitize the following values:
|
||||
+ * - 0x834b -> in the Linksys EA6350v3
|
||||
+ * - 0x8000 -> some manufacturers use this invalid code
|
||||
+ */
|
||||
- if (reg->current_rd != COUNTRY_ERD_FLAG)
|
||||
+ if (reg->current_rd != COUNTRY_ERD_FLAG &&
|
||||
+ reg->current_rd != 0x834b)
|
||||
return;
|
||||
printk(KERN_DEBUG "ath: EEPROM regdomain sanitized\n");
|
@ -1,27 +0,0 @@
|
||||
From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Date: Fri, 2 Nov 2018 21:49:55 +0100
|
||||
Subject: [PATCH] ath9k: dynack: use authentication messages for 'late' ack
|
||||
|
||||
In order to properly support dynack in ad-hoc mode running
|
||||
wpa_supplicant, take into account authentication frames for
|
||||
'late ack' detection. This patch has been tested on devices
|
||||
mounted on offshore high-voltage stations connected through
|
||||
~24Km link
|
||||
|
||||
Reported-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
|
||||
Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
@@ -187,7 +187,8 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
/* late ACK */
|
||||
if (ts->ts_status & ATH9K_TXERR_XRETRY) {
|
||||
if (ieee80211_is_assoc_req(hdr->frame_control) ||
|
||||
- ieee80211_is_assoc_resp(hdr->frame_control)) {
|
||||
+ ieee80211_is_assoc_resp(hdr->frame_control) ||
|
||||
+ ieee80211_is_auth(hdr->frame_control)) {
|
||||
ath_dbg(common, DYNACK, "late ack\n");
|
||||
ath9k_hw_setslottime(ah, (LATEACK_TO - 3) / 2);
|
||||
ath9k_hw_set_ack_timeout(ah, LATEACK_TO);
|
@ -12,9 +12,9 @@ Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
@@ -171,11 +171,12 @@ static void ath_dynack_compute_to(struct
|
||||
void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
struct ath_tx_status *ts)
|
||||
@@ -178,11 +178,12 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
struct ath_tx_status *ts,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
- u8 ridx;
|
||||
struct ieee80211_hdr *hdr;
|
||||
@ -24,9 +24,9 @@ Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
+ u32 dur = ts->duration;
|
||||
+ u8 ridx;
|
||||
|
||||
if ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !da->enabled)
|
||||
if (!da->enabled || (info->flags & IEEE80211_TX_CTL_NO_ACK))
|
||||
return;
|
||||
@@ -203,14 +204,13 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
@@ -217,14 +218,13 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
ridx = ts->ts_rateindex;
|
||||
|
||||
da->st_rbf.ts[da->st_rbf.t_rb].tstamp = ts->ts_tstamp;
|
||||
@ -42,7 +42,7 @@ Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
|
||||
rate = &common->sbands[info->band].bitrates[rates[ridx].idx];
|
||||
if (info->band == NL80211_BAND_2GHZ &&
|
||||
@@ -219,19 +219,18 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
@@ -233,19 +233,18 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
else
|
||||
phy = WLAN_RC_PHY_OFDM;
|
||||
|
||||
@ -68,7 +68,7 @@ Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
ath_dynack_compute_to(ah);
|
||||
|
||||
spin_unlock_bh(&da->qlock);
|
||||
@@ -258,14 +257,13 @@ void ath_dynack_sample_ack_ts(struct ath
|
||||
@@ -272,14 +271,13 @@ void ath_dynack_sample_ack_ts(struct ath
|
||||
spin_lock_bh(&da->qlock);
|
||||
da->ack_rbf.tstamp[da->ack_rbf.t_rb] = ts;
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Date: Fri, 2 Nov 2018 21:49:57 +0100
|
||||
Subject: [PATCH] ath9k: dynack: check da->enabled first in sampling
|
||||
routines
|
||||
|
||||
Check da->enabled flag first in ath_dynack_sample_tx_ts and
|
||||
ath_dynack_sample_ack_ts routines in order to avoid useless
|
||||
processing
|
||||
|
||||
Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
@@ -178,7 +178,7 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
u32 dur = ts->duration;
|
||||
u8 ridx;
|
||||
|
||||
- if ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !da->enabled)
|
||||
+ if (!da->enabled || (info->flags & IEEE80211_TX_CTL_NO_ACK))
|
||||
return;
|
||||
|
||||
spin_lock_bh(&da->qlock);
|
||||
@@ -251,7 +251,7 @@ void ath_dynack_sample_ack_ts(struct ath
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
- if (!ath_dynack_bssidmask(ah, hdr->addr1) || !da->enabled)
|
||||
+ if (!da->enabled || !ath_dynack_bssidmask(ah, hdr->addr1))
|
||||
return;
|
||||
|
||||
spin_lock_bh(&da->qlock);
|
@ -1,139 +0,0 @@
|
||||
From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
Date: Fri, 2 Nov 2018 21:49:58 +0100
|
||||
Subject: [PATCH] ath9k: dynack: make ewma estimation faster
|
||||
|
||||
In order to make propagation time estimation faster,
|
||||
use current sample as ewma output value during 'late ack'
|
||||
tracking
|
||||
|
||||
Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
|
||||
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
|
||||
@@ -274,7 +274,7 @@ struct ath_node {
|
||||
#endif
|
||||
u8 key_idx[4];
|
||||
|
||||
- u32 ackto;
|
||||
+ int ackto;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
|
||||
@@ -29,9 +29,13 @@
|
||||
* ath_dynack_ewma - EWMA (Exponentially Weighted Moving Average) calculation
|
||||
*
|
||||
*/
|
||||
-static inline u32 ath_dynack_ewma(u32 old, u32 new)
|
||||
+static inline int ath_dynack_ewma(int old, int new)
|
||||
{
|
||||
- return (new * (EWMA_DIV - EWMA_LEVEL) + old * EWMA_LEVEL) / EWMA_DIV;
|
||||
+ if (old > 0)
|
||||
+ return (new * (EWMA_DIV - EWMA_LEVEL) +
|
||||
+ old * EWMA_LEVEL) / EWMA_DIV;
|
||||
+ else
|
||||
+ return new;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,10 +86,10 @@ static inline bool ath_dynack_bssidmask(
|
||||
*/
|
||||
static void ath_dynack_compute_ackto(struct ath_hw *ah)
|
||||
{
|
||||
- struct ath_node *an;
|
||||
- u32 to = 0;
|
||||
- struct ath_dynack *da = &ah->dynack;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
+ struct ath_dynack *da = &ah->dynack;
|
||||
+ struct ath_node *an;
|
||||
+ int to = 0;
|
||||
|
||||
list_for_each_entry(an, &da->nodes, list)
|
||||
if (an->ackto > to)
|
||||
@@ -144,7 +148,8 @@ static void ath_dynack_compute_to(struct
|
||||
an->ackto = ath_dynack_ewma(an->ackto,
|
||||
ackto);
|
||||
ath_dbg(ath9k_hw_common(ah), DYNACK,
|
||||
- "%pM to %u\n", dst, an->ackto);
|
||||
+ "%pM to %d [%u]\n", dst,
|
||||
+ an->ackto, ackto);
|
||||
if (time_is_before_jiffies(da->lto)) {
|
||||
ath_dynack_compute_ackto(ah);
|
||||
da->lto = jiffies + COMPUTE_TO;
|
||||
@@ -166,10 +171,12 @@ static void ath_dynack_compute_to(struct
|
||||
* @ah: ath hw
|
||||
* @skb: socket buffer
|
||||
* @ts: tx status info
|
||||
+ * @sta: station pointer
|
||||
*
|
||||
*/
|
||||
void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
- struct ath_tx_status *ts)
|
||||
+ struct ath_tx_status *ts,
|
||||
+ struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ath_dynack *da = &ah->dynack;
|
||||
@@ -191,9 +198,16 @@ void ath_dynack_sample_tx_ts(struct ath_
|
||||
ieee80211_is_assoc_resp(hdr->frame_control) ||
|
||||
ieee80211_is_auth(hdr->frame_control)) {
|
||||
ath_dbg(common, DYNACK, "late ack\n");
|
||||
+
|
||||
ath9k_hw_setslottime(ah, (LATEACK_TO - 3) / 2);
|
||||
ath9k_hw_set_ack_timeout(ah, LATEACK_TO);
|
||||
ath9k_hw_set_cts_timeout(ah, LATEACK_TO);
|
||||
+ if (sta) {
|
||||
+ struct ath_node *an;
|
||||
+
|
||||
+ an = (struct ath_node *)sta->drv_priv;
|
||||
+ an->ackto = -1;
|
||||
+ }
|
||||
da->lto = jiffies + LATEACK_DELAY;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/dynack.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/dynack.h
|
||||
@@ -86,7 +86,8 @@ void ath_dynack_node_deinit(struct ath_h
|
||||
void ath_dynack_init(struct ath_hw *ah);
|
||||
void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct sk_buff *skb, u32 ts);
|
||||
void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
- struct ath_tx_status *ts);
|
||||
+ struct ath_tx_status *ts,
|
||||
+ struct ieee80211_sta *sta);
|
||||
#else
|
||||
static inline void ath_dynack_init(struct ath_hw *ah) {}
|
||||
static inline void ath_dynack_node_init(struct ath_hw *ah,
|
||||
@@ -97,7 +98,8 @@ static inline void ath_dynack_sample_ack
|
||||
struct sk_buff *skb, u32 ts) {}
|
||||
static inline void ath_dynack_sample_tx_ts(struct ath_hw *ah,
|
||||
struct sk_buff *skb,
|
||||
- struct ath_tx_status *ts) {}
|
||||
+ struct ath_tx_status *ts,
|
||||
+ struct ieee80211_sta *sta) {}
|
||||
#endif
|
||||
|
||||
#endif /* DYNACK_H */
|
||||
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||||
@@ -629,7 +629,7 @@ static void ath_tx_complete_aggr(struct
|
||||
if (bf == bf->bf_lastbf)
|
||||
ath_dynack_sample_tx_ts(sc->sc_ah,
|
||||
bf->bf_mpdu,
|
||||
- ts);
|
||||
+ ts, sta);
|
||||
}
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq, &bf_head, sta, ts,
|
||||
@@ -773,7 +773,8 @@ static void ath_tx_process_buffer(struct
|
||||
memcpy(info->control.rates, bf->rates,
|
||||
sizeof(info->control.rates));
|
||||
ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
|
||||
- ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts);
|
||||
+ ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts,
|
||||
+ sta);
|
||||
}
|
||||
ath_tx_complete_buf(sc, bf, txq, bf_head, sta, ts, txok);
|
||||
} else
|
@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -2719,6 +2719,16 @@ int ath10k_core_register(struct ath10k *
|
||||
@@ -2720,6 +2720,16 @@ int ath10k_core_register(struct ath10k *
|
||||
ar->chip_id = chip_id;
|
||||
queue_work(ar->workqueue, &ar->register_work);
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -943,7 +943,7 @@ static int ath10k_core_get_board_id_from
|
||||
if (ret) {
|
||||
ath10k_err(ar, "could not execute otp for board id check: %d\n",
|
||||
ret);
|
||||
- return ret;
|
||||
+ return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
board_id = MS(result, ATH10K_BMI_BOARD_ID_FROM_OTP);
|
@ -172,7 +172,7 @@ v13:
|
||||
.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
@@ -2440,6 +2446,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
@@ -2441,6 +2447,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
if (status)
|
||||
goto err_hif_stop;
|
||||
|
||||
@ -183,7 +183,7 @@ v13:
|
||||
return 0;
|
||||
|
||||
err_hif_stop:
|
||||
@@ -2694,9 +2704,18 @@ static void ath10k_core_register_work(st
|
||||
@@ -2695,9 +2705,18 @@ static void ath10k_core_register_work(st
|
||||
goto err_spectral_destroy;
|
||||
}
|
||||
|
||||
@ -202,7 +202,7 @@ v13:
|
||||
err_spectral_destroy:
|
||||
ath10k_spectral_destroy(ar);
|
||||
err_debug_destroy:
|
||||
@@ -2740,6 +2759,8 @@ void ath10k_core_unregister(struct ath10
|
||||
@@ -2741,6 +2760,8 @@ void ath10k_core_unregister(struct ath10
|
||||
if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
|
||||
return;
|
||||
|
||||
|
@ -0,0 +1,89 @@
|
||||
From: Sriram R <srirrama@codeaurora.org>
|
||||
Date: Mon, 10 Sep 2018 11:09:40 +0530
|
||||
Subject: [PATCH] ath10k: add support for configuring management packet rate
|
||||
|
||||
By default the firmware uses 1Mbps and 6Mbps rate for management packets
|
||||
in 2G and 5G bands respectively. But when the user selects different
|
||||
basic rates from the userspace, we need to send the management
|
||||
packets at the lowest basic rate selected by the user.
|
||||
|
||||
This change makes use of WMI_VDEV_PARAM_MGMT_RATE param for configuring the
|
||||
management packets rate to the firmware.
|
||||
|
||||
Chipsets Tested : QCA988X, QCA9887, QCA9984
|
||||
FW Tested : 10.2.4-1.0-41, 10.4-3.6.104
|
||||
|
||||
Signed-off-by: Sriram R <srirrama@codeaurora.org>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
|
||||
Origin: backport, https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f279294e9ee22a8f306fdc8e4181cf555e6f0f70
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -158,6 +158,22 @@ u8 ath10k_mac_bitrate_to_idx(const struc
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ath10k_mac_get_rate_hw_value(int bitrate)
|
||||
+{
|
||||
+ int i;
|
||||
+ u8 hw_value_prefix = 0;
|
||||
+
|
||||
+ if (ath10k_mac_bitrate_is_cck(bitrate))
|
||||
+ hw_value_prefix = WMI_RATE_PREAMBLE_CCK << 6;
|
||||
+
|
||||
+ for (i = 0; i < sizeof(ath10k_rates); i++) {
|
||||
+ if (ath10k_rates[i].bitrate == bitrate)
|
||||
+ return hw_value_prefix | ath10k_rates[i].hw_value;
|
||||
+ }
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
|
||||
{
|
||||
switch ((mcs_map >> (2 * nss)) & 0x3) {
|
||||
@@ -5468,9 +5484,10 @@ static void ath10k_bss_info_changed(stru
|
||||
struct cfg80211_chan_def def;
|
||||
u32 vdev_param, pdev_param, slottime, preamble;
|
||||
u16 bitrate, hw_value;
|
||||
- u8 rate;
|
||||
- int rateidx, ret = 0;
|
||||
+ u8 rate, basic_rate_idx;
|
||||
+ int rateidx, ret = 0, hw_rate_code;
|
||||
enum nl80211_band band;
|
||||
+ const struct ieee80211_supported_band *sband;
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
@@ -5676,6 +5693,30 @@ static void ath10k_bss_info_changed(stru
|
||||
arvif->vdev_id, ret);
|
||||
}
|
||||
|
||||
+ if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||
+ if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) {
|
||||
+ mutex_unlock(&ar->conf_mutex);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ sband = ar->hw->wiphy->bands[def.chan->band];
|
||||
+ basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
+ bitrate = sband->bitrates[basic_rate_idx].bitrate;
|
||||
+
|
||||
+ hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
|
||||
+ if (hw_rate_code < 0) {
|
||||
+ ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
|
||||
+ mutex_unlock(&ar->conf_mutex);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ vdev_param = ar->wmi.vdev_param->mgmt_rate;
|
||||
+ ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
+ hw_rate_code);
|
||||
+ if (ret)
|
||||
+ ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
|
||||
+ }
|
||||
+
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
}
|
||||
|
@ -0,0 +1,66 @@
|
||||
From: Sriram R <srirrama@codeaurora.org>
|
||||
Date: Wed, 3 Oct 2018 08:43:50 +0530
|
||||
Subject: [PATCH] ath10k: fix possible out of bound access of ath10k_rates array
|
||||
|
||||
While using 'ath10k_mac_get_rate_hw_value()' to obtain the hw value
|
||||
from the passed bitrate, there is a chance of out of bound array access
|
||||
when wrong bitrate is passed. This is fixed by comparing the bitrates
|
||||
within the correct size of the ath10k_rates array.
|
||||
|
||||
Fixes commit f279294e9ee2 ("ath10k: add support for configuring management
|
||||
packet rate"). Also correction made to some indents used in the above commit.
|
||||
|
||||
Signed-off-by: Sriram R <srirrama@codeaurora.org>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
|
||||
Origin: backport, https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e141eea7dd8525dd1ef7a925459e455b4d307f
|
||||
---
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -166,7 +166,7 @@ static int ath10k_mac_get_rate_hw_value(
|
||||
if (ath10k_mac_bitrate_is_cck(bitrate))
|
||||
hw_value_prefix = WMI_RATE_PREAMBLE_CCK << 6;
|
||||
|
||||
- for (i = 0; i < sizeof(ath10k_rates); i++) {
|
||||
+ for (i = 0; i < ARRAY_SIZE(ath10k_rates); i++) {
|
||||
if (ath10k_rates[i].bitrate == bitrate)
|
||||
return hw_value_prefix | ath10k_rates[i].hw_value;
|
||||
}
|
||||
@@ -5699,22 +5699,22 @@ static void ath10k_bss_info_changed(stru
|
||||
return;
|
||||
}
|
||||
|
||||
- sband = ar->hw->wiphy->bands[def.chan->band];
|
||||
- basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
- bitrate = sband->bitrates[basic_rate_idx].bitrate;
|
||||
-
|
||||
- hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
|
||||
- if (hw_rate_code < 0) {
|
||||
- ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
|
||||
- mutex_unlock(&ar->conf_mutex);
|
||||
- return;
|
||||
- }
|
||||
+ sband = ar->hw->wiphy->bands[def.chan->band];
|
||||
+ basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
+ bitrate = sband->bitrates[basic_rate_idx].bitrate;
|
||||
+
|
||||
+ hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
|
||||
+ if (hw_rate_code < 0) {
|
||||
+ ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
|
||||
+ mutex_unlock(&ar->conf_mutex);
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
- vdev_param = ar->wmi.vdev_param->mgmt_rate;
|
||||
- ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
- hw_rate_code);
|
||||
- if (ret)
|
||||
- ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
|
||||
+ vdev_param = ar->wmi.vdev_param->mgmt_rate;
|
||||
+ ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
+ hw_rate_code);
|
||||
+ if (ret)
|
||||
+ ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
|
||||
}
|
||||
|
||||
mutex_unlock(&ar->conf_mutex);
|
@ -0,0 +1,43 @@
|
||||
From: Pradeep kumar Chitrapu <pradeepc@codeaurora.org>
|
||||
Date: Mon, 10 Dec 2018 20:56:11 -0800
|
||||
Subject: ath10k: fix incorrect multicast/broadcast rate setting
|
||||
|
||||
Invalid rate code is sent to firmware when multicast rate value of 0 is
|
||||
sent to driver indicating disabled case, causing broken mesh path.
|
||||
so fix that.
|
||||
|
||||
Tested on QCA9984 with firmware 10.4-3.6.1-00827
|
||||
|
||||
Fixes: cd93b83ad92 ("ath10k: support for multicast rate control")
|
||||
Co-developed-by: Zhi Chen <zhichen@codeaurora.org>
|
||||
Signed-off-by: Zhi Chen <zhichen@codeaurora.org>
|
||||
Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
|
||||
|
||||
Origin: other, https://patchwork.kernel.org/patch/10723033/
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -5484,8 +5484,8 @@ static void ath10k_bss_info_changed(stru
|
||||
struct cfg80211_chan_def def;
|
||||
u32 vdev_param, pdev_param, slottime, preamble;
|
||||
u16 bitrate, hw_value;
|
||||
- u8 rate, basic_rate_idx;
|
||||
- int rateidx, ret = 0, hw_rate_code;
|
||||
+ u8 rate, basic_rate_idx, rateidx;
|
||||
+ int ret = 0, hw_rate_code, mcast_rate;
|
||||
enum nl80211_band band;
|
||||
const struct ieee80211_supported_band *sband;
|
||||
|
||||
@@ -5658,7 +5658,11 @@ static void ath10k_bss_info_changed(stru
|
||||
if (changed & BSS_CHANGED_MCAST_RATE &&
|
||||
!WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) {
|
||||
band = def.chan->band;
|
||||
- rateidx = vif->bss_conf.mcast_rate[band] - 1;
|
||||
+ mcast_rate = vif->bss_conf.mcast_rate[band];
|
||||
+ if (mcast_rate > 0)
|
||||
+ rateidx = mcast_rate - 1;
|
||||
+ else
|
||||
+ rateidx = ffs(vif->bss_conf.basic_rates) - 1;
|
||||
|
||||
if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
|
||||
rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
|
@ -1,67 +0,0 @@
|
||||
From 22d319f2665dd3458d59c934fa0c8cf1b1d7227f Mon Sep 17 00:00:00 2001
|
||||
From: Stijn Tintel <stijn@linux-ipv6.be>
|
||||
Date: Sat, 10 Nov 2018 13:25:20 +0200
|
||||
Subject: [PATCH wireless-drivers] brcmfmac: fix roamoff=1 modparam
|
||||
|
||||
When the update_connect_param callback is set, nl80211 expects the flag
|
||||
WIPHY_FLAG_SUPPORTS_FW_ROAM to be set as well. However, this flag is
|
||||
only set when modparam roamoff=0, while the callback is set
|
||||
unconditionally. Since commit 7f9a3e150ec7 this causes a warning in
|
||||
wiphy_register, which breaks brcmfmac.
|
||||
|
||||
Disable the update_connect_param callback when roamoff=0 to fix this.
|
||||
|
||||
Fixes: 7f9a3e150ec7 ("nl80211: Update ERP info using NL80211_CMD_UPDATE_CONNECT_PARAMS")
|
||||
Cc: Stable <stable@vger.kernel.org> # 4.19+
|
||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
||||
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 11 +++++++++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +-
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +-
|
||||
3 files changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -5188,10 +5188,17 @@ static struct cfg80211_ops brcmf_cfg8021
|
||||
.del_pmk = brcmf_cfg80211_del_pmk,
|
||||
};
|
||||
|
||||
-struct cfg80211_ops *brcmf_cfg80211_get_ops(void)
|
||||
+struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings)
|
||||
{
|
||||
- return kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
|
||||
+ struct cfg80211_ops *ops;
|
||||
+
|
||||
+ ops = kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
|
||||
GFP_KERNEL);
|
||||
+
|
||||
+ if (ops && settings->roamoff)
|
||||
+ ops->update_connect_params = NULL;
|
||||
+
|
||||
+ return ops;
|
||||
}
|
||||
|
||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
|
||||
@@ -404,7 +404,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
|
||||
s32 brcmf_cfg80211_up(struct net_device *ndev);
|
||||
s32 brcmf_cfg80211_down(struct net_device *ndev);
|
||||
-struct cfg80211_ops *brcmf_cfg80211_get_ops(void);
|
||||
+struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings);
|
||||
enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);
|
||||
|
||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1151,7 +1151,7 @@ int brcmf_attach(struct device *dev, str
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
- ops = brcmf_cfg80211_get_ops();
|
||||
+ ops = brcmf_cfg80211_get_ops(settings);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
@ -1,41 +0,0 @@
|
||||
From 3401d42c7ea2d064d15c66698ff8eb96553179ce Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 26 Oct 2018 12:50:39 +0200
|
||||
Subject: [PATCH] brcmutil: really fix decoding channel info for 160 MHz
|
||||
bandwidth
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Previous commit /adding/ support for 160 MHz chanspecs was incomplete.
|
||||
It didn't set bandwidth info and didn't extract control channel info. As
|
||||
the result it was also using uninitialized "sb" var.
|
||||
|
||||
This change has been tested for two chanspecs found to be reported by
|
||||
some devices/firmwares:
|
||||
1) 60/160 (0xee32)
|
||||
Before: chnum:50 control_ch_num:36
|
||||
After: chnum:50 control_ch_num:60
|
||||
2) 120/160 (0xed72)
|
||||
Before: chnum:114 control_ch_num:100
|
||||
After: chnum:114 control_ch_num:120
|
||||
|
||||
Fixes: 330994e8e8ec ("brcmfmac: fix for proper support of 160MHz bandwidth")
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
|
||||
@@ -193,6 +193,9 @@ static void brcmu_d11ac_decchspec(struct
|
||||
}
|
||||
break;
|
||||
case BRCMU_CHSPEC_D11AC_BW_160:
|
||||
+ ch->bw = BRCMU_CHAN_BW_160;
|
||||
+ ch->sb = brcmu_maskget16(ch->chspec, BRCMU_CHSPEC_D11AC_SB_MASK,
|
||||
+ BRCMU_CHSPEC_D11AC_SB_SHIFT);
|
||||
switch (ch->sb) {
|
||||
case BRCMU_CHAN_SB_LLL:
|
||||
ch->control_ch_num -= CH_70MHZ_APART;
|
@ -0,0 +1,80 @@
|
||||
From 4282ff17e557d319e1b988fa4f582792cfaf6fff Mon Sep 17 00:00:00 2001
|
||||
From: Dan Haab <riproute@gmail.com>
|
||||
Date: Fri, 9 Nov 2018 09:38:55 -0700
|
||||
Subject: [PATCH] brcmfmac: support STA info struct v7
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The newest firmwares provide STA info using v7 of the struct. As v7
|
||||
isn't backward compatible, a union is needed.
|
||||
|
||||
Even though brcmfmac does not use any of the new info it's important to
|
||||
provide the proper struct buffer. Without this change new firmwares will
|
||||
fallback to the very limited v3 instead of something in between such as
|
||||
v4.
|
||||
|
||||
Signed-off-by: Dan Haab <dan.haab@luxul.com>
|
||||
Reviewed-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/fwil_types.h | 40 +++++++++++++++----
|
||||
1 file changed, 33 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
||||
@@ -176,6 +176,8 @@
|
||||
|
||||
#define BRCMF_VHT_CAP_MCS_MAP_NSS_MAX 8
|
||||
|
||||
+#define BRCMF_HE_CAP_MCS_MAP_NSS_MAX 8
|
||||
+
|
||||
/* MAX_CHUNK_LEN is the maximum length for data passing to firmware in each
|
||||
* ioctl. It is relatively small because firmware has small maximum size input
|
||||
* playload restriction for ioctls.
|
||||
@@ -601,13 +603,37 @@ 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;
|
||||
+ union {
|
||||
+ struct {
|
||||
+ 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;
|
||||
+ } v5;
|
||||
+
|
||||
+ struct {
|
||||
+ __le32 rx_dur_total; /* total user RX duration (estimated) */
|
||||
+ __le16 chanspec; /** chanspec this sta is on */
|
||||
+ __le16 pad_1;
|
||||
+ struct {
|
||||
+ __le16 version; /* version */
|
||||
+ __le16 len; /* length */
|
||||
+ __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 */
|
||||
+ __le16 he_mcs[BRCMF_HE_CAP_MCS_MAP_NSS_MAX]; /* supported he mcs index bit map per nss */
|
||||
+ } rateset_adv; /* rateset along with mcs index bitmap */
|
||||
+ __le16 wpauth; /* authentication type */
|
||||
+ u8 algo; /* crypto algorithm */
|
||||
+ u8 pad_2;
|
||||
+ __le32 tx_rspec; /* Rate of last successful tx frame */
|
||||
+ __le32 rx_rspec; /* Rate of last successful rx frame */
|
||||
+ __le32 wnm_cap; /* wnm capabilities */
|
||||
+ } v7;
|
||||
+ };
|
||||
};
|
||||
|
||||
struct brcmf_chanspec_list {
|
@ -0,0 +1,39 @@
|
||||
From 554da3868eb1d7174710c18b4ddd6ff01f6d612c Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 23 Nov 2018 10:11:48 +0100
|
||||
Subject: [PATCH] brcmfmac: Call brcmf_dmi_probe before brcmf_of_probe
|
||||
|
||||
ARM systems with UEFI may have both devicetree (of) and DMI data in this
|
||||
case we end up setting brcmf_mp_device.board_type twice.
|
||||
|
||||
In this case we should prefer the devicetree data, because:
|
||||
1) The devicerree data is more reliable
|
||||
2) Some ARM systems (e.g. the Raspberry Pi 3 models) support both UEFI and
|
||||
classic uboot booting, the devicetree data is always there, so using it
|
||||
makes sure we ask for the same nvram file independent of how we booted.
|
||||
|
||||
This commit moves the brcmf_dmi_probe call to before the brcmf_of_probe
|
||||
call, so that the latter can override the value of the first if both are
|
||||
set.
|
||||
|
||||
Fixes: bd1e82bb420a ("brcmfmac: Set board_type from DMI on x86 based ...")
|
||||
Cc: Peter Robinson <pbrobinson@gmail.com>
|
||||
Tested-and-reported-by: Peter Robinson <pbrobinson@gmail.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -449,8 +449,8 @@ struct brcmf_mp_device *brcmf_get_module
|
||||
}
|
||||
if (!found) {
|
||||
/* No platform data for this device, try OF and DMI data */
|
||||
- brcmf_of_probe(dev, bus_type, settings);
|
||||
brcmf_dmi_probe(settings, chip, chiprev);
|
||||
+ brcmf_of_probe(dev, bus_type, settings);
|
||||
}
|
||||
return settings;
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
From 153e22c0ff1260035cd7fe72c8aeead1f5fac757 Mon Sep 17 00:00:00 2001
|
||||
From: Wright Feng <Wright.Feng@cypress.com>
|
||||
Date: Mon, 5 Nov 2018 05:51:54 +0000
|
||||
Subject: [PATCH] brcmfmac: add credit numbers updating support
|
||||
|
||||
The credit numbers are static and tunable per chip in firmware side.
|
||||
However the credit number may be changed that is based on packet pool
|
||||
length and will send BRCMF_E_FIFO_CREDIT_MAP event to notify host driver
|
||||
updates the credit numbers during interface up.
|
||||
The purpose of this patch is making host driver has ability of updating
|
||||
the credit numbers when receiving the BRCMF_E_FIFO_CREDIT_MAP event.
|
||||
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/fwsignal.c | 23 ++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
@@ -511,6 +511,7 @@ struct brcmf_fws_info {
|
||||
struct work_struct fws_dequeue_work;
|
||||
u32 fifo_enqpkt[BRCMF_FWS_FIFO_COUNT];
|
||||
int fifo_credit[BRCMF_FWS_FIFO_COUNT];
|
||||
+ int init_fifo_credit[BRCMF_FWS_FIFO_COUNT];
|
||||
int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1];
|
||||
int deq_node_pos[BRCMF_FWS_FIFO_COUNT];
|
||||
u32 fifo_credit_map;
|
||||
@@ -1237,6 +1238,9 @@ static void brcmf_fws_return_credits(str
|
||||
}
|
||||
|
||||
fws->fifo_credit[fifo] += credits;
|
||||
+ if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo])
|
||||
+ fws->fifo_credit[fifo] = fws->init_fifo_credit[fifo];
|
||||
+
|
||||
}
|
||||
|
||||
static void brcmf_fws_schedule_deq(struct brcmf_fws_info *fws)
|
||||
@@ -1595,19 +1599,21 @@ static int brcmf_fws_notify_credit_map(s
|
||||
brcmf_err("event payload too small (%d)\n", e->datalen);
|
||||
return -EINVAL;
|
||||
}
|
||||
- if (fws->creditmap_received)
|
||||
- return 0;
|
||||
|
||||
fws->creditmap_received = true;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: credits %pM\n", credits);
|
||||
brcmf_fws_lock(fws);
|
||||
for (i = 0; i < ARRAY_SIZE(fws->fifo_credit); i++) {
|
||||
- if (*credits)
|
||||
+ fws->fifo_credit[i] += credits[i] - fws->init_fifo_credit[i];
|
||||
+ fws->init_fifo_credit[i] = credits[i];
|
||||
+ if (fws->fifo_credit[i] > 0)
|
||||
fws->fifo_credit_map |= 1 << i;
|
||||
else
|
||||
fws->fifo_credit_map &= ~(1 << i);
|
||||
- fws->fifo_credit[i] = *credits++;
|
||||
+ WARN_ONCE(fws->fifo_credit[i] < 0,
|
||||
+ "fifo_credit[%d] is negative(%d)\n", i,
|
||||
+ fws->fifo_credit[i]);
|
||||
}
|
||||
brcmf_fws_schedule_deq(fws);
|
||||
brcmf_fws_unlock(fws);
|
||||
@@ -2013,7 +2019,7 @@ static int brcmf_fws_borrow_credit(struc
|
||||
}
|
||||
|
||||
for (lender_ac = 0; lender_ac <= BRCMF_FWS_FIFO_AC_VO; lender_ac++) {
|
||||
- if (fws->fifo_credit[lender_ac]) {
|
||||
+ if (fws->fifo_credit[lender_ac] > 0) {
|
||||
fws->credits_borrowed[lender_ac]++;
|
||||
fws->fifo_credit[lender_ac]--;
|
||||
if (fws->fifo_credit[lender_ac] == 0)
|
||||
@@ -2210,8 +2216,9 @@ static void brcmf_fws_dequeue_worker(str
|
||||
}
|
||||
continue;
|
||||
}
|
||||
- while ((fws->fifo_credit[fifo]) || ((!fws->bcmc_credit_check) &&
|
||||
- (fifo == BRCMF_FWS_FIFO_BCMC))) {
|
||||
+ while ((fws->fifo_credit[fifo] > 0) ||
|
||||
+ ((!fws->bcmc_credit_check) &&
|
||||
+ (fifo == BRCMF_FWS_FIFO_BCMC))) {
|
||||
skb = brcmf_fws_deq(fws, fifo);
|
||||
if (!skb)
|
||||
break;
|
||||
@@ -2222,7 +2229,7 @@ static void brcmf_fws_dequeue_worker(str
|
||||
break;
|
||||
}
|
||||
if ((fifo == BRCMF_FWS_FIFO_AC_BE) &&
|
||||
- (fws->fifo_credit[fifo] == 0) &&
|
||||
+ (fws->fifo_credit[fifo] <= 0) &&
|
||||
(!fws->bus_flow_blocked)) {
|
||||
while (brcmf_fws_borrow_credit(fws) == 0) {
|
||||
skb = brcmf_fws_deq(fws, fifo);
|
@ -0,0 +1,42 @@
|
||||
From a3bdc6deb60bf6be4405058ca49a686c4db08c39 Mon Sep 17 00:00:00 2001
|
||||
From: Wright Feng <Wright.Feng@cypress.com>
|
||||
Date: Mon, 5 Nov 2018 05:51:59 +0000
|
||||
Subject: [PATCH] brcmfmac: enable frameburst mode in default firmware setting
|
||||
|
||||
The frameburst feature can enable per-packet framebursting in firmware
|
||||
side and get higher TX throughput in High Throughput(HT) mode. To enhance
|
||||
TX throughput, we enable frameburst mode in default firmware setting.
|
||||
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 6 ++++++
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h | 1 +
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6638,6 +6638,12 @@ static s32 brcmf_config_dongle(struct br
|
||||
|
||||
brcmf_configure_arp_nd_offload(ifp, true);
|
||||
|
||||
+ err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_FAKEFRAG, 1);
|
||||
+ if (err) {
|
||||
+ brcmf_err("failed to set frameburst mode\n");
|
||||
+ goto default_conf_out;
|
||||
+ }
|
||||
+
|
||||
cfg->dongle_up = true;
|
||||
default_conf_out:
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
|
||||
@@ -80,6 +80,7 @@
|
||||
#define BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON 201
|
||||
#define BRCMF_C_SET_ASSOC_PREFER 205
|
||||
#define BRCMF_C_GET_VALID_CHANNELS 217
|
||||
+#define BRCMF_C_SET_FAKEFRAG 219
|
||||
#define BRCMF_C_GET_KEY_PRIMARY 235
|
||||
#define BRCMF_C_SET_KEY_PRIMARY 236
|
||||
#define BRCMF_C_SET_SCAN_PASSIVE_TIME 258
|
@ -0,0 +1,229 @@
|
||||
From e4af3ffb43d50f070134aa1b40d5c3573f57deb1 Mon Sep 17 00:00:00 2001
|
||||
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
||||
Date: Mon, 5 Nov 2018 05:52:05 +0000
|
||||
Subject: [PATCH] brcmfmac: handle compressed tx status signal
|
||||
|
||||
Firmware inform the driver about tx status by normal tx status signal
|
||||
or compressed tx status signal. This patch adds support to handle the
|
||||
compressed tx status signal.
|
||||
|
||||
Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/fwsignal.c | 121 ++++++++++--------
|
||||
1 file changed, 71 insertions(+), 50 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
|
||||
@@ -1455,9 +1455,10 @@ static int brcmf_fws_txstatus_suppressed
|
||||
|
||||
static int
|
||||
brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot,
|
||||
- u32 genbit, u16 seq)
|
||||
+ u32 genbit, u16 seq, u8 compcnt)
|
||||
{
|
||||
u32 fifo;
|
||||
+ u8 cnt = 0;
|
||||
int ret;
|
||||
bool remove_from_hanger = true;
|
||||
struct sk_buff *skb;
|
||||
@@ -1468,60 +1469,71 @@ brcmf_fws_txs_process(struct brcmf_fws_i
|
||||
brcmf_dbg(DATA, "flags %d\n", flags);
|
||||
|
||||
if (flags == BRCMF_FWS_TXSTATUS_DISCARD)
|
||||
- fws->stats.txs_discard++;
|
||||
+ fws->stats.txs_discard += compcnt;
|
||||
else if (flags == BRCMF_FWS_TXSTATUS_CORE_SUPPRESS) {
|
||||
- fws->stats.txs_supp_core++;
|
||||
+ fws->stats.txs_supp_core += compcnt;
|
||||
remove_from_hanger = false;
|
||||
} else if (flags == BRCMF_FWS_TXSTATUS_FW_PS_SUPPRESS) {
|
||||
- fws->stats.txs_supp_ps++;
|
||||
+ fws->stats.txs_supp_ps += compcnt;
|
||||
remove_from_hanger = false;
|
||||
} else if (flags == BRCMF_FWS_TXSTATUS_FW_TOSSED)
|
||||
- fws->stats.txs_tossed++;
|
||||
+ fws->stats.txs_tossed += compcnt;
|
||||
else if (flags == BRCMF_FWS_TXSTATUS_HOST_TOSSED)
|
||||
- fws->stats.txs_host_tossed++;
|
||||
+ fws->stats.txs_host_tossed += compcnt;
|
||||
else
|
||||
brcmf_err("unexpected txstatus\n");
|
||||
|
||||
- ret = brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
|
||||
- remove_from_hanger);
|
||||
- if (ret != 0) {
|
||||
- brcmf_err("no packet in hanger slot: hslot=%d\n", hslot);
|
||||
- return ret;
|
||||
- }
|
||||
+ while (cnt < compcnt) {
|
||||
+ ret = brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
|
||||
+ remove_from_hanger);
|
||||
+ if (ret != 0) {
|
||||
+ brcmf_err("no packet in hanger slot: hslot=%d\n",
|
||||
+ hslot);
|
||||
+ goto cont;
|
||||
+ }
|
||||
|
||||
- skcb = brcmf_skbcb(skb);
|
||||
- entry = skcb->mac;
|
||||
- if (WARN_ON(!entry)) {
|
||||
- brcmu_pkt_buf_free_skb(skb);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
- entry->transit_count--;
|
||||
- if (entry->suppressed && entry->suppr_transit_count)
|
||||
- entry->suppr_transit_count--;
|
||||
-
|
||||
- brcmf_dbg(DATA, "%s flags %d htod %X seq %X\n", entry->name, flags,
|
||||
- skcb->htod, seq);
|
||||
-
|
||||
- /* pick up the implicit credit from this packet */
|
||||
- fifo = brcmf_skb_htod_tag_get_field(skb, FIFO);
|
||||
- if ((fws->fcmode == BRCMF_FWS_FCMODE_IMPLIED_CREDIT) ||
|
||||
- (brcmf_skb_if_flags_get_field(skb, REQ_CREDIT)) ||
|
||||
- (flags == BRCMF_FWS_TXSTATUS_HOST_TOSSED)) {
|
||||
- brcmf_fws_return_credits(fws, fifo, 1);
|
||||
- brcmf_fws_schedule_deq(fws);
|
||||
- }
|
||||
- brcmf_fws_macdesc_return_req_credit(skb);
|
||||
+ skcb = brcmf_skbcb(skb);
|
||||
+ entry = skcb->mac;
|
||||
+ if (WARN_ON(!entry)) {
|
||||
+ brcmu_pkt_buf_free_skb(skb);
|
||||
+ goto cont;
|
||||
+ }
|
||||
+ entry->transit_count--;
|
||||
+ if (entry->suppressed && entry->suppr_transit_count)
|
||||
+ entry->suppr_transit_count--;
|
||||
|
||||
- ret = brcmf_proto_hdrpull(fws->drvr, false, skb, &ifp);
|
||||
- if (ret) {
|
||||
- brcmu_pkt_buf_free_skb(skb);
|
||||
- return -EINVAL;
|
||||
+ brcmf_dbg(DATA, "%s flags %d htod %X seq %X\n", entry->name,
|
||||
+ flags, skcb->htod, seq);
|
||||
+
|
||||
+ /* pick up the implicit credit from this packet */
|
||||
+ fifo = brcmf_skb_htod_tag_get_field(skb, FIFO);
|
||||
+ if (fws->fcmode == BRCMF_FWS_FCMODE_IMPLIED_CREDIT ||
|
||||
+ (brcmf_skb_if_flags_get_field(skb, REQ_CREDIT)) ||
|
||||
+ flags == BRCMF_FWS_TXSTATUS_HOST_TOSSED) {
|
||||
+ brcmf_fws_return_credits(fws, fifo, 1);
|
||||
+ brcmf_fws_schedule_deq(fws);
|
||||
+ }
|
||||
+ brcmf_fws_macdesc_return_req_credit(skb);
|
||||
+
|
||||
+ ret = brcmf_proto_hdrpull(fws->drvr, false, skb, &ifp);
|
||||
+ if (ret) {
|
||||
+ brcmu_pkt_buf_free_skb(skb);
|
||||
+ goto cont;
|
||||
+ }
|
||||
+ if (!remove_from_hanger)
|
||||
+ ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb,
|
||||
+ genbit, seq);
|
||||
+ if (remove_from_hanger || ret)
|
||||
+ brcmf_txfinalize(ifp, skb, true);
|
||||
+
|
||||
+cont:
|
||||
+ hslot = (hslot + 1) & (BRCMF_FWS_TXSTAT_HSLOT_MASK >>
|
||||
+ BRCMF_FWS_TXSTAT_HSLOT_SHIFT);
|
||||
+ if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode))
|
||||
+ seq = (seq + 1) & BRCMF_SKB_HTOD_SEQ_NR_MASK;
|
||||
+
|
||||
+ cnt++;
|
||||
}
|
||||
- if (!remove_from_hanger)
|
||||
- ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb,
|
||||
- genbit, seq);
|
||||
- if (remove_from_hanger || ret)
|
||||
- brcmf_txfinalize(ifp, skb, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1547,7 +1559,8 @@ static int brcmf_fws_fifocreditback_indi
|
||||
return BRCMF_FWS_RET_OK_SCHEDULE;
|
||||
}
|
||||
|
||||
-static int brcmf_fws_txstatus_indicate(struct brcmf_fws_info *fws, u8 *data)
|
||||
+static int brcmf_fws_txstatus_indicate(struct brcmf_fws_info *fws, u8 type,
|
||||
+ u8 *data)
|
||||
{
|
||||
__le32 status_le;
|
||||
__le16 seq_le;
|
||||
@@ -1556,23 +1569,31 @@ static int brcmf_fws_txstatus_indicate(s
|
||||
u32 genbit;
|
||||
u8 flags;
|
||||
u16 seq;
|
||||
+ u8 compcnt;
|
||||
+ u8 compcnt_offset = BRCMF_FWS_TYPE_TXSTATUS_LEN;
|
||||
|
||||
- fws->stats.txs_indicate++;
|
||||
memcpy(&status_le, data, sizeof(status_le));
|
||||
status = le32_to_cpu(status_le);
|
||||
flags = brcmf_txstatus_get_field(status, FLAGS);
|
||||
hslot = brcmf_txstatus_get_field(status, HSLOT);
|
||||
genbit = brcmf_txstatus_get_field(status, GENERATION);
|
||||
if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) {
|
||||
- memcpy(&seq_le, &data[BRCMF_FWS_TYPE_PKTTAG_LEN],
|
||||
+ memcpy(&seq_le, &data[BRCMF_FWS_TYPE_TXSTATUS_LEN],
|
||||
sizeof(seq_le));
|
||||
seq = le16_to_cpu(seq_le);
|
||||
+ compcnt_offset += BRCMF_FWS_TYPE_SEQ_LEN;
|
||||
} else {
|
||||
seq = 0;
|
||||
}
|
||||
|
||||
+ if (type == BRCMF_FWS_TYPE_COMP_TXSTATUS)
|
||||
+ compcnt = data[compcnt_offset];
|
||||
+ else
|
||||
+ compcnt = 1;
|
||||
+ fws->stats.txs_indicate += compcnt;
|
||||
+
|
||||
brcmf_fws_lock(fws);
|
||||
- brcmf_fws_txs_process(fws, flags, hslot, genbit, seq);
|
||||
+ brcmf_fws_txs_process(fws, flags, hslot, genbit, seq, compcnt);
|
||||
brcmf_fws_unlock(fws);
|
||||
return BRCMF_FWS_RET_OK_NOSCHEDULE;
|
||||
}
|
||||
@@ -1888,8 +1909,6 @@ void brcmf_fws_hdrpull(struct brcmf_if *
|
||||
|
||||
err = BRCMF_FWS_RET_OK_NOSCHEDULE;
|
||||
switch (type) {
|
||||
- case BRCMF_FWS_TYPE_COMP_TXSTATUS:
|
||||
- break;
|
||||
case BRCMF_FWS_TYPE_HOST_REORDER_RXPKTS:
|
||||
rd = (struct brcmf_skb_reorder_data *)skb->cb;
|
||||
rd->reorder = data;
|
||||
@@ -1912,7 +1931,8 @@ void brcmf_fws_hdrpull(struct brcmf_if *
|
||||
err = brcmf_fws_request_indicate(fws, type, data);
|
||||
break;
|
||||
case BRCMF_FWS_TYPE_TXSTATUS:
|
||||
- brcmf_fws_txstatus_indicate(fws, data);
|
||||
+ case BRCMF_FWS_TYPE_COMP_TXSTATUS:
|
||||
+ brcmf_fws_txstatus_indicate(fws, type, data);
|
||||
break;
|
||||
case BRCMF_FWS_TYPE_FIFO_CREDITBACK:
|
||||
err = brcmf_fws_fifocreditback_indicate(fws, data);
|
||||
@@ -2001,7 +2021,7 @@ static void brcmf_fws_rollback_toq(struc
|
||||
fws->stats.rollback_failed++;
|
||||
hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
|
||||
brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED,
|
||||
- hslot, 0, 0);
|
||||
+ hslot, 0, 0, 1);
|
||||
} else {
|
||||
fws->stats.rollback_success++;
|
||||
brcmf_fws_return_credits(fws, fifo, 1);
|
||||
@@ -2462,7 +2482,8 @@ void brcmf_fws_bustxfail(struct brcmf_fw
|
||||
}
|
||||
brcmf_fws_lock(fws);
|
||||
hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
|
||||
- brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0);
|
||||
+ brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0,
|
||||
+ 1);
|
||||
brcmf_fws_unlock(fws);
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
From eb6b33bfb8f56859df7264dccc2ca8ab7c57342a Mon Sep 17 00:00:00 2001
|
||||
From: Winnie Chang <winnie.chang@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:42 +0000
|
||||
Subject: [PATCH] brcmfmac: add 4354 raw pcie device id
|
||||
|
||||
Add the raw 4354 PCIe device ID for unprogrammed Cypress boards.
|
||||
|
||||
Reviewed-by: Arend Van Spriel <arend@broadcom.com>
|
||||
Signed-off-by: Winnie Chang <winnie.chang@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -2019,6 +2019,7 @@ static const struct dev_pm_ops brcmf_pci
|
||||
static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
|
||||
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -74,6 +74,7 @@
|
||||
/* PCIE Device IDs */
|
||||
#define BRCM_PCIE_4350_DEVICE_ID 0x43a3
|
||||
#define BRCM_PCIE_4354_DEVICE_ID 0x43df
|
||||
+#define BRCM_PCIE_4354_RAW_DEVICE_ID 0x4354
|
||||
#define BRCM_PCIE_4356_DEVICE_ID 0x43ec
|
||||
#define BRCM_PCIE_43567_DEVICE_ID 0x43d3
|
||||
#define BRCM_PCIE_43570_DEVICE_ID 0x43d9
|
@ -0,0 +1,73 @@
|
||||
From e1a08730eeb0bad4d82c3bc40e74854872de618d Mon Sep 17 00:00:00 2001
|
||||
From: Wright Feng <wright.feng@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:44 +0000
|
||||
Subject: [PATCH] brcmfmac: set F2 watermark to 256 for 4373
|
||||
|
||||
We got SDIO_CRC_ERROR with 4373 on SDR104 when doing bi-directional
|
||||
throughput test. Enable watermark to 256 to guarantee the operation
|
||||
stability.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 26 +++++++++++++++++--
|
||||
1 file changed, 24 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -49,6 +49,10 @@
|
||||
#define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500)
|
||||
#define CTL_DONE_TIMEOUT msecs_to_jiffies(2500)
|
||||
|
||||
+/* watermark expressed in number of words */
|
||||
+#define DEFAULT_F2_WATERMARK 0x8
|
||||
+#define CY_4373_F2_WATERMARK 0x40
|
||||
+
|
||||
#ifdef DEBUG
|
||||
|
||||
#define BRCMF_TRAP_INFO_SIZE 80
|
||||
@@ -138,6 +142,8 @@ struct rte_console {
|
||||
/* 1: isolate internal sdio signals, put external pads in tri-state; requires
|
||||
* sdio bus power cycle to clear (rev 9) */
|
||||
#define SBSDIO_DEVCTL_PADS_ISO 0x08
|
||||
+/* 1: enable F2 Watermark */
|
||||
+#define SBSDIO_DEVCTL_F2WM_ENAB 0x10
|
||||
/* Force SD->SB reset mapping (rev 11) */
|
||||
#define SBSDIO_DEVCTL_SB_RST_CTL 0x30
|
||||
/* Determined by CoreControl bit */
|
||||
@@ -4046,6 +4052,7 @@ static void brcmf_sdio_firmware_callback
|
||||
void *nvram;
|
||||
u32 nvram_len;
|
||||
u8 saveclk;
|
||||
+ u8 devctl;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
|
||||
|
||||
@@ -4101,8 +4108,23 @@ static void brcmf_sdio_firmware_callback
|
||||
brcmf_sdiod_writel(sdiod, core->base + SD_REG(hostintmask),
|
||||
bus->hostintmask, NULL);
|
||||
|
||||
-
|
||||
- brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK, 8, &err);
|
||||
+ switch (sdiod->func1->device) {
|
||||
+ case SDIO_DEVICE_ID_CYPRESS_4373:
|
||||
+ brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
|
||||
+ CY_4373_F2_WATERMARK);
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
|
||||
+ CY_4373_F2_WATERMARK, &err);
|
||||
+ devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
|
||||
+ &err);
|
||||
+ devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
|
||||
+ &err);
|
||||
+ break;
|
||||
+ default:
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
|
||||
+ DEFAULT_F2_WATERMARK, &err);
|
||||
+ break;
|
||||
+ }
|
||||
} else {
|
||||
/* Disable F2 again */
|
||||
sdio_disable_func(sdiod->func2);
|
@ -0,0 +1,55 @@
|
||||
From 58e4bbea0c1d9b5ace11df968c5dc096ce052a73 Mon Sep 17 00:00:00 2001
|
||||
From: Madhan Mohan R <MadhanMohan.R@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:45 +0000
|
||||
Subject: [PATCH] brcmfmac: set SDIO F1 MesBusyCtrl for CYW4373
|
||||
|
||||
Along with F2 watermark (existing) configuration, F1 MesBusyCtrl
|
||||
should be enabled & sdio device RX FIFO watermark should be
|
||||
configured to avoid overflow errors.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Madhan Mohan R <madhanmohan.r@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 +++
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h | 9 ++++++++-
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4119,6 +4119,9 @@ static void brcmf_sdio_firmware_callback
|
||||
devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
|
||||
brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
|
||||
&err);
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
|
||||
+ CY_4373_F2_WATERMARK |
|
||||
+ SBSDIO_MESBUSYCTRL_ENAB, &err);
|
||||
break;
|
||||
default:
|
||||
brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
@@ -77,7 +77,7 @@
|
||||
#define SBSDIO_GPIO_OUT 0x10006
|
||||
/* gpio enable */
|
||||
#define SBSDIO_GPIO_EN 0x10007
|
||||
-/* rev < 7, watermark for sdio device */
|
||||
+/* rev < 7, watermark for sdio device TX path */
|
||||
#define SBSDIO_WATERMARK 0x10008
|
||||
/* control busy signal generation */
|
||||
#define SBSDIO_DEVICE_CTL 0x10009
|
||||
@@ -104,6 +104,13 @@
|
||||
#define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C
|
||||
/* MesBusyCtl (rev 11) */
|
||||
#define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D
|
||||
+/* Watermark for sdio device RX path */
|
||||
+#define SBSDIO_MESBUSY_RXFIFO_WM_MASK 0x7F
|
||||
+#define SBSDIO_MESBUSY_RXFIFO_WM_SHIFT 0
|
||||
+/* Enable busy capability for MES access */
|
||||
+#define SBSDIO_MESBUSYCTRL_ENAB 0x80
|
||||
+#define SBSDIO_MESBUSYCTRL_ENAB_SHIFT 7
|
||||
+
|
||||
/* Sdio Core Rev 12 */
|
||||
#define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E
|
||||
#define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK 0x1
|
@ -0,0 +1,253 @@
|
||||
From 35cb51b2162a1a7c5cd977f92595e60ab14d3b22 Mon Sep 17 00:00:00 2001
|
||||
From: Chi-Hsien Lin <Chi-Hsien.Lin@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:47 +0000
|
||||
Subject: [PATCH] brcmfmac: add support for CYW43012 SDIO chipset
|
||||
|
||||
CYW43012 is a 1x1 802.11a/b/g/n Dual-Band HT20, 256-QAM/Turbo QAM. It
|
||||
is an Ultra Low Power WLAN+BT combo chip.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Praveen Babu C <praveen.chandran@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 +
|
||||
.../broadcom/brcm80211/brcmfmac/chip.c | 14 +++-
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 74 ++++++++++++++++---
|
||||
.../broadcom/brcm80211/include/brcm_hw_ids.h | 1 +
|
||||
include/linux/mmc/sdio_ids.h | 1 +
|
||||
5 files changed, 78 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
@@ -972,6 +972,7 @@ static const struct sdio_device_id brcmf
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
|
||||
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
|
||||
+ BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43012),
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -165,6 +165,7 @@ struct sbconfig {
|
||||
#define SRCI_LSS_MASK 0x00f00000
|
||||
#define SRCI_LSS_SHIFT 20
|
||||
#define SRCI_SRNB_MASK 0xf0
|
||||
+#define SRCI_SRNB_MASK_EXT 0x100
|
||||
#define SRCI_SRNB_SHIFT 4
|
||||
#define SRCI_SRBSZ_MASK 0xf
|
||||
#define SRCI_SRBSZ_SHIFT 0
|
||||
@@ -592,7 +593,13 @@ static void brcmf_chip_socram_ramsize(st
|
||||
if (lss != 0)
|
||||
*ramsize += (1 << ((lss - 1) + SR_BSZ_BASE));
|
||||
} else {
|
||||
- nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
|
||||
+ /* length of SRAM Banks increased for corerev greater than 23 */
|
||||
+ if (sr->pub.rev >= 23) {
|
||||
+ nb = (coreinfo & (SRCI_SRNB_MASK | SRCI_SRNB_MASK_EXT))
|
||||
+ >> SRCI_SRNB_SHIFT;
|
||||
+ } else {
|
||||
+ nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
|
||||
+ }
|
||||
for (i = 0; i < nb; i++) {
|
||||
retent = brcmf_chip_socram_banksize(sr, i, &banksize);
|
||||
*ramsize += banksize;
|
||||
@@ -1356,6 +1363,11 @@ bool brcmf_chip_sr_capable(struct brcmf_
|
||||
addr = CORE_CC_REG(base, sr_control1);
|
||||
reg = chip->ops->read32(chip->ctx, addr);
|
||||
return reg != 0;
|
||||
+ case CY_CC_43012_CHIP_ID:
|
||||
+ addr = CORE_CC_REG(pmu->base, retention_ctl);
|
||||
+ reg = chip->ops->read32(chip->ctx, addr);
|
||||
+ return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK |
|
||||
+ PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
|
||||
default:
|
||||
addr = CORE_CC_REG(pmu->base, pmucapabilities_ext);
|
||||
reg = chip->ops->read32(chip->ctx, addr);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -624,6 +624,7 @@ BRCMF_FW_DEF(43455, "brcmfmac43455-sdio"
|
||||
BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
|
||||
BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
|
||||
BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
|
||||
+BRCMF_FW_DEF(43012, "brcmfmac43012-sdio");
|
||||
|
||||
static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
|
||||
@@ -643,7 +644,8 @@ static const struct brcmf_firmware_mappi
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
- BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
|
||||
+ BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
|
||||
+ BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012)
|
||||
};
|
||||
|
||||
static void pkt_align(struct sk_buff *p, int len, int align)
|
||||
@@ -677,6 +679,14 @@ brcmf_sdio_kso_control(struct brcmf_sdio
|
||||
/* 1st KSO write goes to AOS wake up core if device is asleep */
|
||||
brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err);
|
||||
|
||||
+ /* In case of 43012 chip, the chip could go down immediately after
|
||||
+ * KSO bit is cleared. So the further reads of KSO register could
|
||||
+ * fail. Thereby just bailing out immediately after clearing KSO
|
||||
+ * bit, to avoid polling of KSO bit.
|
||||
+ */
|
||||
+ if (!on && bus->ci->chip == CY_CC_43012_CHIP_ID)
|
||||
+ return err;
|
||||
+
|
||||
if (on) {
|
||||
/* device WAKEUP through KSO:
|
||||
* write bit 0 & read back until
|
||||
@@ -2402,6 +2412,14 @@ static int brcmf_sdio_tx_ctrlframe(struc
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static bool brcmf_chip_is_ulp(struct brcmf_chip *ci)
|
||||
+{
|
||||
+ if (ci->chip == CY_CC_43012_CHIP_ID)
|
||||
+ return true;
|
||||
+ else
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static void brcmf_sdio_bus_stop(struct device *dev)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
@@ -2409,7 +2427,7 @@ static void brcmf_sdio_bus_stop(struct d
|
||||
struct brcmf_sdio *bus = sdiodev->bus;
|
||||
struct brcmf_core *core = bus->sdio_core;
|
||||
u32 local_hostintmask;
|
||||
- u8 saveclk;
|
||||
+ u8 saveclk, bpreq;
|
||||
int err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
@@ -2436,9 +2454,14 @@ static void brcmf_sdio_bus_stop(struct d
|
||||
/* Force backplane clocks to assure F2 interrupt propagates */
|
||||
saveclk = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
&err);
|
||||
- if (!err)
|
||||
- brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
- (saveclk | SBSDIO_FORCE_HT), &err);
|
||||
+ if (!err) {
|
||||
+ bpreq = saveclk;
|
||||
+ bpreq |= brcmf_chip_is_ulp(bus->ci) ?
|
||||
+ SBSDIO_HT_AVAIL_REQ : SBSDIO_FORCE_HT;
|
||||
+ brcmf_sdiod_writeb(sdiodev,
|
||||
+ SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
+ bpreq, &err);
|
||||
+ }
|
||||
if (err)
|
||||
brcmf_err("Failed to force clock for F2: err %d\n",
|
||||
err);
|
||||
@@ -3328,20 +3351,45 @@ err:
|
||||
return bcmerror;
|
||||
}
|
||||
|
||||
+static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
|
||||
+{
|
||||
+ if (bus->ci->chip == CY_CC_43012_CHIP_ID)
|
||||
+ return true;
|
||||
+ else
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static void brcmf_sdio_sr_init(struct brcmf_sdio *bus)
|
||||
{
|
||||
int err = 0;
|
||||
u8 val;
|
||||
+ u8 wakeupctrl;
|
||||
+ u8 cardcap;
|
||||
+ u8 chipclkcsr;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
+ if (brcmf_chip_is_ulp(bus->ci)) {
|
||||
+ wakeupctrl = SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT;
|
||||
+ chipclkcsr = SBSDIO_HT_AVAIL_REQ;
|
||||
+ } else {
|
||||
+ wakeupctrl = SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT;
|
||||
+ chipclkcsr = SBSDIO_FORCE_HT;
|
||||
+ }
|
||||
+
|
||||
+ if (brcmf_sdio_aos_no_decode(bus)) {
|
||||
+ cardcap = SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC;
|
||||
+ } else {
|
||||
+ cardcap = (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT |
|
||||
+ SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT);
|
||||
+ }
|
||||
+
|
||||
val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, &err);
|
||||
if (err) {
|
||||
brcmf_err("error reading SBSDIO_FUNC1_WAKEUPCTRL\n");
|
||||
return;
|
||||
}
|
||||
-
|
||||
- val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT;
|
||||
+ val |= 1 << wakeupctrl;
|
||||
brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, val, &err);
|
||||
if (err) {
|
||||
brcmf_err("error writing SBSDIO_FUNC1_WAKEUPCTRL\n");
|
||||
@@ -3350,8 +3398,7 @@ static void brcmf_sdio_sr_init(struct br
|
||||
|
||||
/* Add CMD14 Support */
|
||||
brcmf_sdiod_func0_wb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP,
|
||||
- (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT |
|
||||
- SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT),
|
||||
+ cardcap,
|
||||
&err);
|
||||
if (err) {
|
||||
brcmf_err("error writing SDIO_CCCR_BRCM_CARDCAP\n");
|
||||
@@ -3359,7 +3406,7 @@ static void brcmf_sdio_sr_init(struct br
|
||||
}
|
||||
|
||||
brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
- SBSDIO_FORCE_HT, &err);
|
||||
+ chipclkcsr, &err);
|
||||
if (err) {
|
||||
brcmf_err("error writing SBSDIO_FUNC1_CHIPCLKCSR\n");
|
||||
return;
|
||||
@@ -4051,7 +4098,7 @@ static void brcmf_sdio_firmware_callback
|
||||
const struct firmware *code;
|
||||
void *nvram;
|
||||
u32 nvram_len;
|
||||
- u8 saveclk;
|
||||
+ u8 saveclk, bpreq;
|
||||
u8 devctl;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
|
||||
@@ -4085,8 +4132,11 @@ static void brcmf_sdio_firmware_callback
|
||||
/* Force clocks on backplane to be sure F2 interrupt propagates */
|
||||
saveclk = brcmf_sdiod_readb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR, &err);
|
||||
if (!err) {
|
||||
+ bpreq = saveclk;
|
||||
+ bpreq |= brcmf_chip_is_ulp(bus->ci) ?
|
||||
+ SBSDIO_HT_AVAIL_REQ : SBSDIO_FORCE_HT;
|
||||
brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR,
|
||||
- (saveclk | SBSDIO_FORCE_HT), &err);
|
||||
+ bpreq, &err);
|
||||
}
|
||||
if (err) {
|
||||
brcmf_err("Failed to force clock for F2: err %d\n", err);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -60,6 +60,7 @@
|
||||
#define BRCM_CC_43664_CHIP_ID 43664
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
#define CY_CC_4373_CHIP_ID 0x4373
|
||||
+#define CY_CC_43012_CHIP_ID 43012
|
||||
|
||||
/* USB Device IDs */
|
||||
#define BRCM_USB_43143_DEVICE_ID 0xbd1e
|
||||
--- a/include/linux/mmc/sdio_ids.h
|
||||
+++ b/include/linux/mmc/sdio_ids.h
|
||||
@@ -42,6 +42,7 @@
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4354 0x4354
|
||||
#define SDIO_DEVICE_ID_BROADCOM_4356 0x4356
|
||||
#define SDIO_DEVICE_ID_CYPRESS_4373 0x4373
|
||||
+#define SDIO_DEVICE_ID_CYPRESS_43012 43012
|
||||
|
||||
#define SDIO_VENDOR_ID_INTEL 0x0089
|
||||
#define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX 0x1402
|
@ -0,0 +1,60 @@
|
||||
From b021a6bc1175442609af0b66d64f850883e155fb Mon Sep 17 00:00:00 2001
|
||||
From: Chi-Hsien Lin <Chi-Hsien.Lin@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:48 +0000
|
||||
Subject: [PATCH] brcmfmac: allow GCI core enumuration
|
||||
|
||||
GCI core is needed for ULP operation. Allow GCI core enumuration with
|
||||
below changes:
|
||||
- Allow GCI to be added to core list even when it doesn't have a wrapper.
|
||||
- Allow 8K address space size.
|
||||
- Don't overwrite the address value when an additional size descriptor
|
||||
is in place.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/chip.c | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -786,7 +786,7 @@ static int brcmf_chip_dmp_get_regaddr(st
|
||||
u32 *regbase, u32 *wrapbase)
|
||||
{
|
||||
u8 desc;
|
||||
- u32 val;
|
||||
+ u32 val, szdesc;
|
||||
u8 mpnum = 0;
|
||||
u8 stype, sztype, wraptype;
|
||||
|
||||
@@ -832,14 +832,15 @@ static int brcmf_chip_dmp_get_regaddr(st
|
||||
|
||||
/* next size descriptor can be skipped */
|
||||
if (sztype == DMP_SLAVE_SIZE_DESC) {
|
||||
- val = brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
|
||||
+ szdesc = brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
|
||||
/* skip upper size descriptor if present */
|
||||
- if (val & DMP_DESC_ADDRSIZE_GT32)
|
||||
+ if (szdesc & DMP_DESC_ADDRSIZE_GT32)
|
||||
brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
|
||||
}
|
||||
|
||||
- /* only look for 4K register regions */
|
||||
- if (sztype != DMP_SLAVE_SIZE_4K)
|
||||
+ /* look for 4K or 8K register regions */
|
||||
+ if (sztype != DMP_SLAVE_SIZE_4K &&
|
||||
+ sztype != DMP_SLAVE_SIZE_8K)
|
||||
continue;
|
||||
|
||||
stype = (val & DMP_SLAVE_TYPE) >> DMP_SLAVE_TYPE_S;
|
||||
@@ -896,7 +897,8 @@ int brcmf_chip_dmp_erom_scan(struct brcm
|
||||
|
||||
/* need core with ports */
|
||||
if (nmw + nsw == 0 &&
|
||||
- id != BCMA_CORE_PMU)
|
||||
+ id != BCMA_CORE_PMU &&
|
||||
+ id != BCMA_CORE_GCI)
|
||||
continue;
|
||||
|
||||
/* try to obtain register address info */
|
@ -0,0 +1,49 @@
|
||||
From f95a8d9c6aca196f1ace5b2e53a3dd3bc491b1b3 Mon Sep 17 00:00:00 2001
|
||||
From: Naveen Gupta <naveen.gupta@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:49 +0000
|
||||
Subject: [PATCH] brcmfmac: update 43012 F2 watermark setting to fix DMA Error
|
||||
during UDP RX Traffic
|
||||
|
||||
The number of words that the read FIFO has to contain except
|
||||
the end of frame before sends data back to the host.
|
||||
Max watermark = (512B - 2* (BurstLength))/4 =
|
||||
(512 - 128)/4 = 384/4 = 0x60
|
||||
so if burst length (i.e. BurstLength = 64) is increased,
|
||||
watermark has to be reduced. This is the optimal setting for this chip.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Naveen Gupta <naveen.gupta@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -52,6 +52,7 @@
|
||||
/* watermark expressed in number of words */
|
||||
#define DEFAULT_F2_WATERMARK 0x8
|
||||
#define CY_4373_F2_WATERMARK 0x40
|
||||
+#define CY_43012_F2_WATERMARK 0x60
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
@@ -4173,6 +4174,17 @@ static void brcmf_sdio_firmware_callback
|
||||
CY_4373_F2_WATERMARK |
|
||||
SBSDIO_MESBUSYCTRL_ENAB, &err);
|
||||
break;
|
||||
+ case SDIO_DEVICE_ID_CYPRESS_43012:
|
||||
+ brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
|
||||
+ CY_43012_F2_WATERMARK);
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
|
||||
+ CY_43012_F2_WATERMARK, &err);
|
||||
+ devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
|
||||
+ &err);
|
||||
+ devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
|
||||
+ brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
|
||||
+ &err);
|
||||
+ break;
|
||||
default:
|
||||
brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
|
||||
DEFAULT_F2_WATERMARK, &err);
|
@ -0,0 +1,57 @@
|
||||
From 2f2d389efda4caa4c1b69cb4fa2ab217f0fe6d6f Mon Sep 17 00:00:00 2001
|
||||
From: Chi-Hsien Lin <Chi-Hsien.Lin@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:50 +0000
|
||||
Subject: [PATCH] brcmfmac: 4373 save-restore support
|
||||
|
||||
Use chipcommon sr_control0 register to check 4373 sr support.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/chip.c | 5 +++++
|
||||
.../broadcom/brcm80211/include/chipcommon.h | 19 +++++++++++++++++++
|
||||
2 files changed, 24 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -1365,6 +1365,11 @@ bool brcmf_chip_sr_capable(struct brcmf_
|
||||
addr = CORE_CC_REG(base, sr_control1);
|
||||
reg = chip->ops->read32(chip->ctx, addr);
|
||||
return reg != 0;
|
||||
+ case CY_CC_4373_CHIP_ID:
|
||||
+ /* explicitly check SR engine enable bit */
|
||||
+ addr = CORE_CC_REG(base, sr_control0);
|
||||
+ reg = chip->ops->read32(chip->ctx, addr);
|
||||
+ return (reg & CC_SR_CTL0_ENABLE_MASK) != 0;
|
||||
case CY_CC_43012_CHIP_ID:
|
||||
addr = CORE_CC_REG(pmu->base, retention_ctl);
|
||||
reg = chip->ops->read32(chip->ctx, addr);
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
|
||||
@@ -269,6 +269,25 @@ struct chipcregs {
|
||||
/* GSIO (spi/i2c) present, rev >= 37 */
|
||||
#define CC_CAP2_GSIO 0x00000002
|
||||
|
||||
+/* sr_control0, rev >= 48 */
|
||||
+#define CC_SR_CTL0_ENABLE_MASK BIT(0)
|
||||
+#define CC_SR_CTL0_ENABLE_SHIFT 0
|
||||
+#define CC_SR_CTL0_EN_SR_ENG_CLK_SHIFT 1 /* sr_clk to sr_memory enable */
|
||||
+#define CC_SR_CTL0_RSRC_TRIGGER_SHIFT 2 /* Rising edge resource trigger 0 to
|
||||
+ * sr_engine
|
||||
+ */
|
||||
+#define CC_SR_CTL0_MIN_DIV_SHIFT 6 /* Min division value for fast clk
|
||||
+ * in sr_engine
|
||||
+ */
|
||||
+#define CC_SR_CTL0_EN_SBC_STBY_SHIFT 16
|
||||
+#define CC_SR_CTL0_EN_SR_ALP_CLK_MASK_SHIFT 18
|
||||
+#define CC_SR_CTL0_EN_SR_HT_CLK_SHIFT 19
|
||||
+#define CC_SR_CTL0_ALLOW_PIC_SHIFT 20 /* Allow pic to separate power
|
||||
+ * domains
|
||||
+ */
|
||||
+#define CC_SR_CTL0_MAX_SR_LQ_CLK_CNT_SHIFT 25
|
||||
+#define CC_SR_CTL0_EN_MEM_DISABLE_FOR_SLEEP 30
|
||||
+
|
||||
/* pmucapabilities */
|
||||
#define PCAP_REV_MASK 0x000000ff
|
||||
#define PCAP_RC_MASK 0x00001f00
|
@ -0,0 +1,45 @@
|
||||
From 29f6589140a10ece8c1d73f58043ea5b3473ab3e Mon Sep 17 00:00:00 2001
|
||||
From: Wright Feng <wright.feng@cypress.com>
|
||||
Date: Wed, 21 Nov 2018 07:53:52 +0000
|
||||
Subject: [PATCH] brcmfmac: disable command decode in sdio_aos
|
||||
|
||||
AOS is a part of the SDIOD core that becomes active when the rest of
|
||||
SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
|
||||
commands.
|
||||
|
||||
Transaction between AOS and SDIOD is not protected, and if cmd 52 is
|
||||
received in AOS and in the middle of response state changed from AOS to
|
||||
SDIOD, response is corrupted and it causes to SDIO Host controller to
|
||||
hang.
|
||||
|
||||
Command decode for below chips are disabled in this commit:
|
||||
- 4339
|
||||
- 4345
|
||||
- 4354
|
||||
- 4373
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Wright Feng <wright.feng@cypress.com>
|
||||
Signed-off-by: Double Lo <double.lo@cypress.com>
|
||||
Signed-off-by: Madhan Mohan R <madhanmohan.r@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -3354,7 +3354,11 @@ err:
|
||||
|
||||
static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
|
||||
{
|
||||
- if (bus->ci->chip == CY_CC_43012_CHIP_ID)
|
||||
+ if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
|
||||
+ bus->ci->chip == CY_CC_4373_CHIP_ID ||
|
||||
+ bus->ci->chip == BRCM_CC_4339_CHIP_ID ||
|
||||
+ bus->ci->chip == BRCM_CC_4345_CHIP_ID ||
|
||||
+ bus->ci->chip == BRCM_CC_4354_CHIP_ID)
|
||||
return true;
|
||||
else
|
||||
return false;
|
@ -0,0 +1,34 @@
|
||||
From 412dd15c8177d93abe0c8787b83b31c5eb061405 Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Mon, 10 Dec 2018 21:55:37 +0100
|
||||
Subject: [PATCH] brcmfmac: fix false-positive -Wmaybe-unintialized warning
|
||||
|
||||
When CONFIG_NO_AUTO_INLINE is set, we get a false-postive warning
|
||||
for the brcmf_fw_request_nvram_done() function, after gcc figures
|
||||
out that brcmf_fw_nvram_from_efi() might not set the 'data_len'
|
||||
variable, but fails to notice that it always returns NULL:
|
||||
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c: In function 'brcmf_fw_request_nvram_done':
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c:560:11: error: 'data_len' may be used uninitialized in this function [-Werror=maybe-uninitialized]
|
||||
|
||||
Mark it 'inline' to force gcc to understand this.
|
||||
|
||||
Fixes: ce2e6db554fa ("brcmfmac: Add support for getting nvram contents from EFI variables")
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -512,7 +512,7 @@ fail:
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
-static u8 *brcmf_fw_nvram_from_efi(size_t *data_len) { return NULL; }
|
||||
+static inline u8 *brcmf_fw_nvram_from_efi(size_t *data_len) { return NULL; }
|
||||
#endif
|
||||
|
||||
static void brcmf_fw_free_request(struct brcmf_fw_request *req)
|
@ -0,0 +1,41 @@
|
||||
From 861cb5eb467f5e38dce1aabe4e8db379255bd89b Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Wed, 12 Dec 2018 20:20:06 +0100
|
||||
Subject: [PATCH] brcmfmac: Fix access point mode
|
||||
|
||||
Since commit 1204aa17f3b4 ("brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag")
|
||||
the Raspberry Pi 3 A+ (BCM43455) isn't able to operate in AP mode with
|
||||
hostapd (device_ap_sme=1 use_monitor=0):
|
||||
|
||||
brcmfmac: brcmf_cfg80211_stop_ap: setting AP mode failed -52
|
||||
|
||||
So add the missing mgmt_stypes for AP mode to fix this.
|
||||
|
||||
Fixes: 1204aa17f3b4 ("brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag")
|
||||
Suggested-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6308,6 +6308,16 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] =
|
||||
.tx = 0xffff,
|
||||
.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
|
||||
BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
|
||||
+ },
|
||||
+ [NL80211_IFTYPE_AP] = {
|
||||
+ .tx = 0xffff,
|
||||
+ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_DISASSOC >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_AUTH >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_DEAUTH >> 4) |
|
||||
+ BIT(IEEE80211_STYPE_ACTION >> 4)
|
||||
}
|
||||
};
|
||||
|
@ -0,0 +1,51 @@
|
||||
From 4d95f99c59b8b814bcf09ba86020d937ec7caa86 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Thu, 20 Dec 2018 17:40:58 +0100
|
||||
Subject: [PATCH] brcmfmac: Add DMI nvram filename quirk for PoV TAB-P1006W-232
|
||||
tablet
|
||||
|
||||
The Point of View TAB-P1006W-232 tablet contains quite generic names in
|
||||
the sys_vendor and product_name DMI strings, without this patch brcmfmac
|
||||
will try to load: brcmfmac43340-sdio.Insyde-BayTrail.txt as nvram file
|
||||
which is a bit too generic.
|
||||
|
||||
Add a DMI quirk so that a unique and clearly identifiable nvram file
|
||||
name is used on the PoV TAB-P1006W-232 tablet.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/dmi.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c
|
||||
@@ -43,6 +43,10 @@ static const struct brcmf_dmi_data meego
|
||||
BRCM_CC_43340_CHIP_ID, 2, "meegopad-t08"
|
||||
};
|
||||
|
||||
+static const struct brcmf_dmi_data pov_tab_p1006w_data = {
|
||||
+ BRCM_CC_43340_CHIP_ID, 2, "pov-tab-p1006w-data"
|
||||
+};
|
||||
+
|
||||
static const struct dmi_system_id dmi_platform_data[] = {
|
||||
{
|
||||
/* Match for the GPDwin which unfortunately uses somewhat
|
||||
@@ -81,6 +85,17 @@ static const struct dmi_system_id dmi_pl
|
||||
},
|
||||
.driver_data = (void *)&meegopad_t08_data,
|
||||
},
|
||||
+ {
|
||||
+ /* Point of View TAB-P1006W-232 */
|
||||
+ .matches = {
|
||||
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Insyde"),
|
||||
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BayTrail"),
|
||||
+ /* Note 105b is Foxcon's USB/PCI vendor id */
|
||||
+ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "105B"),
|
||||
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"),
|
||||
+ },
|
||||
+ .driver_data = (void *)&pov_tab_p1006w_data,
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 42daad3343be4a4e1ee03e30a5f5cc731dadfef5 Mon Sep 17 00:00:00 2001
|
||||
From: Kangjie Lu <kjlu@umn.edu>
|
||||
Date: Tue, 25 Dec 2018 19:22:24 -0600
|
||||
Subject: [PATCH] brcmfmac: add a check for the status of usb_register
|
||||
|
||||
usb_register() may fail, so let's check its status and issue an error
|
||||
message if it fails.
|
||||
|
||||
Signed-off-by: Kangjie Lu <kjlu@umn.edu>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1552,6 +1552,10 @@ void brcmf_usb_exit(void)
|
||||
|
||||
void brcmf_usb_register(void)
|
||||
{
|
||||
+ int ret;
|
||||
+
|
||||
brcmf_dbg(USB, "Enter\n");
|
||||
- usb_register(&brcmf_usbdrvr);
|
||||
+ ret = usb_register(&brcmf_usbdrvr);
|
||||
+ if (ret)
|
||||
+ brcmf_err("usb_register failed %d\n", ret);
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
From 3a33bd840523aaa06f4429fbfd38922bf0dc2e8d Mon Sep 17 00:00:00 2001
|
||||
From: Lo-Hsiang Lo <double.lo@cypress.com>
|
||||
Date: Mon, 7 Jan 2019 08:46:16 +0000
|
||||
Subject: [PATCH] brcmfmac: fix system warning message during wowl suspend
|
||||
|
||||
There is a system warning message, warn_slowpath-fmt, during suspend
|
||||
while using supplicant join AP and enable wowl feature by IW command.
|
||||
It's caused by brcmf_pno_remove_request path can't find the reqid.
|
||||
This fix will not go to remove pno request function if there is no
|
||||
pno scan.
|
||||
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Lo-Hsiang Lo <double.lo@cypress.com>
|
||||
Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
|
||||
@@ -496,6 +496,11 @@ int brcmf_pno_stop_sched_scan(struct brc
|
||||
brcmf_dbg(TRACE, "reqid=%llu\n", reqid);
|
||||
|
||||
pi = ifp_to_pno(ifp);
|
||||
+
|
||||
+ /* No PNO request */
|
||||
+ if (!pi->n_reqs)
|
||||
+ return 0;
|
||||
+
|
||||
err = brcmf_pno_remove_request(pi, reqid);
|
||||
if (err)
|
||||
return err;
|
@ -0,0 +1,104 @@
|
||||
From 5cc898fbcb352b764f8d51c16e10e2eb0056173d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 6 Feb 2019 12:28:15 +0100
|
||||
Subject: [PATCH] brcmfmac: modify __brcmf_err() to take bus as a parameter
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far __brcmf_err() was using pr_err() which didn't allow identifying
|
||||
device that was affected by an error. It's crucial for systems with more
|
||||
than 1 device supported by brcmfmac (a common case for home routers).
|
||||
|
||||
This change allows passing struct brcmf_bus to the __brcmf_err(). That
|
||||
struct has been agreed to be the most common one. It allows accessing
|
||||
struct device easily & using dev_err() printing helper.
|
||||
|
||||
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/common.c | 7 +++++--
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h | 8 +++++---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/tracepoint.c | 9 +++++++--
|
||||
3 files changed, 17 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -350,7 +350,7 @@ done:
|
||||
}
|
||||
|
||||
#ifndef CPTCFG_BRCM_TRACING
|
||||
-void __brcmf_err(const char *func, const char *fmt, ...)
|
||||
+void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
@@ -359,7 +359,10 @@ void __brcmf_err(const char *func, const
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
- pr_err("%s: %pV", func, &vaf);
|
||||
+ if (bus)
|
||||
+ dev_err(bus->dev, "%s: %pV", func, &vaf);
|
||||
+ else
|
||||
+ pr_err("%s: %pV", func, &vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -45,8 +45,10 @@
|
||||
#undef pr_fmt
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
-__printf(2, 3)
|
||||
-void __brcmf_err(const char *func, const char *fmt, ...);
|
||||
+struct brcmf_bus;
|
||||
+
|
||||
+__printf(3, 4)
|
||||
+void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...);
|
||||
/* Macro for error messages. When debugging / tracing the driver all error
|
||||
* messages are important to us.
|
||||
*/
|
||||
@@ -55,7 +57,7 @@ void __brcmf_err(const char *func, const
|
||||
if (IS_ENABLED(CPTCFG_BRCMDBG) || \
|
||||
IS_ENABLED(CPTCFG_BRCM_TRACING) || \
|
||||
net_ratelimit()) \
|
||||
- __brcmf_err(__func__, fmt, ##__VA_ARGS__); \
|
||||
+ __brcmf_err(NULL, __func__, fmt, ##__VA_ARGS__);\
|
||||
} while (0)
|
||||
|
||||
#if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c
|
||||
@@ -14,14 +14,16 @@
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
+#include <linux/device.h>
|
||||
#include <linux/module.h> /* bug in tracepoint.h, it should include this */
|
||||
|
||||
#ifndef __CHECKER__
|
||||
#define CREATE_TRACE_POINTS
|
||||
+#include "bus.h"
|
||||
#include "tracepoint.h"
|
||||
#include "debug.h"
|
||||
|
||||
-void __brcmf_err(const char *func, const char *fmt, ...)
|
||||
+void __brcmf_err(struct brcmf_bus *bus, const char *func, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf = {
|
||||
.fmt = fmt,
|
||||
@@ -30,7 +32,10 @@ void __brcmf_err(const char *func, const
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.va = &args;
|
||||
- pr_err("%s: %pV", func, &vaf);
|
||||
+ if (bus)
|
||||
+ dev_err(bus->dev, "%s: %pV", func, &vaf);
|
||||
+ else
|
||||
+ pr_err("%s: %pV", func, &vaf);
|
||||
trace_brcmf_err(func, &vaf);
|
||||
va_end(args);
|
||||
}
|
@ -0,0 +1,266 @@
|
||||
From 8602e62441aba276cafd68034b72162fbc5ca0a6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 6 Feb 2019 12:28:16 +0100
|
||||
Subject: [PATCH] brcmfmac: pass bus to the __brcmf_err() in pcie.c
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This enables dev_err() usage (instead of pr_err()) in the __brcmf_err().
|
||||
It makes error messages more meaningful and is important for debugging
|
||||
errors/bugs on systems with multiple brcmfmac supported devices.
|
||||
|
||||
All bus files should follow & get updated similarly (soon).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/debug.h | 2 +
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 59 +++++++++++--------
|
||||
2 files changed, 38 insertions(+), 23 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
|
||||
@@ -52,6 +52,7 @@ void __brcmf_err(struct brcmf_bus *bus,
|
||||
/* Macro for error messages. When debugging / tracing the driver all error
|
||||
* messages are important to us.
|
||||
*/
|
||||
+#ifndef brcmf_err
|
||||
#define brcmf_err(fmt, ...) \
|
||||
do { \
|
||||
if (IS_ENABLED(CPTCFG_BRCMDBG) || \
|
||||
@@ -59,6 +60,7 @@ void __brcmf_err(struct brcmf_bus *bus,
|
||||
net_ratelimit()) \
|
||||
__brcmf_err(NULL, __func__, fmt, ##__VA_ARGS__);\
|
||||
} while (0)
|
||||
+#endif
|
||||
|
||||
#if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -30,6 +30,15 @@
|
||||
#include <brcmu_wifi.h>
|
||||
#include <brcm_hw_ids.h>
|
||||
|
||||
+/* Custom brcmf_err() that takes bus arg and passes it further */
|
||||
+#define brcmf_err(bus, fmt, ...) \
|
||||
+ do { \
|
||||
+ if (IS_ENABLED(CPTCFG_BRCMDBG) || \
|
||||
+ IS_ENABLED(CPTCFG_BRCM_TRACING) || \
|
||||
+ net_ratelimit()) \
|
||||
+ __brcmf_err(bus, __func__, fmt, ##__VA_ARGS__); \
|
||||
+ } while (0)
|
||||
+
|
||||
#include "debug.h"
|
||||
#include "bus.h"
|
||||
#include "commonring.h"
|
||||
@@ -531,6 +540,7 @@ static void
|
||||
brcmf_pcie_select_core(struct brcmf_pciedev_info *devinfo, u16 coreid)
|
||||
{
|
||||
const struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
struct brcmf_core *core;
|
||||
u32 bar0_win;
|
||||
|
||||
@@ -548,7 +558,7 @@ brcmf_pcie_select_core(struct brcmf_pcie
|
||||
}
|
||||
}
|
||||
} else {
|
||||
- brcmf_err("Unsupported core selected %x\n", coreid);
|
||||
+ brcmf_err(bus, "Unsupported core selected %x\n", coreid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -848,9 +858,8 @@ static irqreturn_t brcmf_pcie_isr_thread
|
||||
|
||||
static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
- struct pci_dev *pdev;
|
||||
-
|
||||
- pdev = devinfo->pdev;
|
||||
+ struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
brcmf_pcie_intr_disable(devinfo);
|
||||
|
||||
@@ -861,7 +870,7 @@ static int brcmf_pcie_request_irq(struct
|
||||
brcmf_pcie_isr_thread, IRQF_SHARED,
|
||||
"brcmf_pcie_intr", devinfo)) {
|
||||
pci_disable_msi(pdev);
|
||||
- brcmf_err("Failed to request IRQ %d\n", pdev->irq);
|
||||
+ brcmf_err(bus, "Failed to request IRQ %d\n", pdev->irq);
|
||||
return -EIO;
|
||||
}
|
||||
devinfo->irq_allocated = true;
|
||||
@@ -871,15 +880,14 @@ static int brcmf_pcie_request_irq(struct
|
||||
|
||||
static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
- struct pci_dev *pdev;
|
||||
+ struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
u32 status;
|
||||
u32 count;
|
||||
|
||||
if (!devinfo->irq_allocated)
|
||||
return;
|
||||
|
||||
- pdev = devinfo->pdev;
|
||||
-
|
||||
brcmf_pcie_intr_disable(devinfo);
|
||||
free_irq(pdev->irq, devinfo);
|
||||
pci_disable_msi(pdev);
|
||||
@@ -891,7 +899,7 @@ static void brcmf_pcie_release_irq(struc
|
||||
count++;
|
||||
}
|
||||
if (devinfo->in_irq)
|
||||
- brcmf_err("Still in IRQ (processing) !!!\n");
|
||||
+ brcmf_err(bus, "Still in IRQ (processing) !!!\n");
|
||||
|
||||
status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT);
|
||||
brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, status);
|
||||
@@ -1102,6 +1110,7 @@ static void brcmf_pcie_release_ringbuffe
|
||||
|
||||
static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
struct brcmf_pcie_ringbuf *ring;
|
||||
struct brcmf_pcie_ringbuf *rings;
|
||||
u32 d2h_w_idx_ptr;
|
||||
@@ -1254,7 +1263,7 @@ static int brcmf_pcie_init_ringbuffers(s
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
- brcmf_err("Allocating ring buffers failed\n");
|
||||
+ brcmf_err(bus, "Allocating ring buffers failed\n");
|
||||
brcmf_pcie_release_ringbuffers(devinfo);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -1277,6 +1286,7 @@ brcmf_pcie_release_scratchbuffers(struct
|
||||
|
||||
static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
u64 address;
|
||||
u32 addr;
|
||||
|
||||
@@ -1316,7 +1326,7 @@ static int brcmf_pcie_init_scratchbuffer
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
- brcmf_err("Allocating scratch buffers failed\n");
|
||||
+ brcmf_err(bus, "Allocating scratch buffers failed\n");
|
||||
brcmf_pcie_release_scratchbuffers(devinfo);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -1437,6 +1447,7 @@ static int
|
||||
brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
|
||||
u32 sharedram_addr)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
struct brcmf_pcie_shared_info *shared;
|
||||
u32 addr;
|
||||
|
||||
@@ -1448,7 +1459,8 @@ brcmf_pcie_init_share_ram_info(struct br
|
||||
brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version);
|
||||
if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
|
||||
(shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
|
||||
- brcmf_err("Unsupported PCIE version %d\n", shared->version);
|
||||
+ brcmf_err(bus, "Unsupported PCIE version %d\n",
|
||||
+ shared->version);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1490,6 +1502,7 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
const struct firmware *fw, void *nvram,
|
||||
u32 nvram_len)
|
||||
{
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
|
||||
u32 sharedram_addr;
|
||||
u32 sharedram_addr_written;
|
||||
u32 loop_counter;
|
||||
@@ -1544,7 +1557,7 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
loop_counter--;
|
||||
}
|
||||
if (sharedram_addr == sharedram_addr_written) {
|
||||
- brcmf_err("FW failed to initialize\n");
|
||||
+ brcmf_err(bus, "FW failed to initialize\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
|
||||
@@ -1555,16 +1568,15 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
|
||||
static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
- struct pci_dev *pdev;
|
||||
+ struct pci_dev *pdev = devinfo->pdev;
|
||||
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
||||
int err;
|
||||
phys_addr_t bar0_addr, bar1_addr;
|
||||
ulong bar1_size;
|
||||
|
||||
- pdev = devinfo->pdev;
|
||||
-
|
||||
err = pci_enable_device(pdev);
|
||||
if (err) {
|
||||
- brcmf_err("pci_enable_device failed err=%d\n", err);
|
||||
+ brcmf_err(bus, "pci_enable_device failed err=%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1577,7 +1589,7 @@ static int brcmf_pcie_get_resource(struc
|
||||
/* read Bar-1 mapped memory range */
|
||||
bar1_size = pci_resource_len(pdev, 2);
|
||||
if ((bar1_size == 0) || (bar1_addr == 0)) {
|
||||
- brcmf_err("BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
|
||||
+ brcmf_err(bus, "BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
|
||||
bar1_size, (unsigned long long)bar1_addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1586,7 +1598,7 @@ static int brcmf_pcie_get_resource(struc
|
||||
devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
|
||||
|
||||
if (!devinfo->regs || !devinfo->tcm) {
|
||||
- brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs,
|
||||
+ brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
|
||||
devinfo->tcm);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1873,7 +1885,7 @@ fail_bus:
|
||||
kfree(bus->msgbuf);
|
||||
kfree(bus);
|
||||
fail:
|
||||
- brcmf_err("failed %x:%x\n", pdev->vendor, pdev->device);
|
||||
+ brcmf_err(NULL, "failed %x:%x\n", pdev->vendor, pdev->device);
|
||||
brcmf_pcie_release_resource(devinfo);
|
||||
if (devinfo->ci)
|
||||
brcmf_chip_detach(devinfo->ci);
|
||||
@@ -1947,7 +1959,7 @@ static int brcmf_pcie_pm_enter_D3(struct
|
||||
wait_event_timeout(devinfo->mbdata_resp_wait, devinfo->mbdata_completed,
|
||||
BRCMF_PCIE_MBDATA_TIMEOUT);
|
||||
if (!devinfo->mbdata_completed) {
|
||||
- brcmf_err("Timeout on response for entering D3 substate\n");
|
||||
+ brcmf_err(bus, "Timeout on response for entering D3 substate\n");
|
||||
brcmf_bus_change_state(bus, BRCMF_BUS_UP);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -1993,7 +2005,7 @@ cleanup:
|
||||
|
||||
err = brcmf_pcie_probe(pdev, NULL);
|
||||
if (err)
|
||||
- brcmf_err("probe after resume failed, err=%d\n", err);
|
||||
+ brcmf_err(bus, "probe after resume failed, err=%d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -2066,7 +2078,8 @@ void brcmf_pcie_register(void)
|
||||
brcmf_dbg(PCIE, "Enter\n");
|
||||
err = pci_register_driver(&brcmf_pciedrvr);
|
||||
if (err)
|
||||
- brcmf_err("PCIE driver registration failed, err=%d\n", err);
|
||||
+ brcmf_err(NULL, "PCIE driver registration failed, err=%d\n",
|
||||
+ err);
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,62 @@
|
||||
From 2359dd09f9819c7d57d81e05173541f0f9f820c7 Mon Sep 17 00:00:00 2001
|
||||
From: Matteo Croce <mcroce@redhat.com>
|
||||
Date: Tue, 29 Jan 2019 18:47:17 +0100
|
||||
Subject: [PATCH] brcmfmac: fix typos
|
||||
|
||||
Fix spelling mistakes in brcmfmac: "lenght" -> "length".
|
||||
The typos are also in the special comment blocks which
|
||||
translates to documentation.
|
||||
|
||||
Signed-off-by: Matteo Croce <mcroce@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h | 2 +-
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
|
||||
@@ -36,7 +36,7 @@
|
||||
#define BRCMF_DCMD_MEDLEN 1536
|
||||
#define BRCMF_DCMD_MAXLEN 8192
|
||||
|
||||
-/* IOCTL from host to device are limited in lenght. A device can only handle
|
||||
+/* IOCTL from host to device are limited in length. A device can only handle
|
||||
* ethernet frame size. This limitation is to be applied by protocol layer.
|
||||
*/
|
||||
#define BRCMF_TX_IOCTL_MAX_MSG_SIZE (ETH_FRAME_LEN+ETH_FCS_LEN)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -47,7 +47,7 @@ enum nvram_parser_state {
|
||||
* @state: current parser state.
|
||||
* @data: input buffer being parsed.
|
||||
* @nvram: output buffer with parse result.
|
||||
- * @nvram_len: lenght of parse result.
|
||||
+ * @nvram_len: length of parse result.
|
||||
* @line: current line.
|
||||
* @column: current column in line.
|
||||
* @pos: byte offset in input buffer.
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
|
||||
@@ -266,7 +266,7 @@ struct brcmf_event {
|
||||
* @status: status information.
|
||||
* @reason: reason code.
|
||||
* @auth_type: authentication type.
|
||||
- * @datalen: lenght of event data buffer.
|
||||
+ * @datalen: length of event data buffer.
|
||||
* @addr: ether address.
|
||||
* @ifname: interface name.
|
||||
* @ifidx: interface index.
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -508,7 +508,7 @@ static void brcmf_usb_rx_complete(struct
|
||||
skb = req->skb;
|
||||
req->skb = NULL;
|
||||
|
||||
- /* zero lenght packets indicate usb "failure". Do not refill */
|
||||
+ /* zero length packets indicate usb "failure". Do not refill */
|
||||
if (urb->status != 0 || !urb->actual_length) {
|
||||
brcmu_pkt_buf_free_skb(skb);
|
||||
brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
|
@ -0,0 +1,143 @@
|
||||
From e665988be29ccea3584528967b432a5cfd801ca4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 8 Feb 2019 07:42:30 +0100
|
||||
Subject: [PATCH] brcmfmac: support monitor frames with the hardware/ucode
|
||||
header
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far there were two monitor frame formats:
|
||||
1) 802.11 frames (with frame (sub)type & all addresses)
|
||||
2) 802.11 frames with the radiotap header
|
||||
|
||||
Testing the latest FullMAC firmwares for 4366b1/4366c0 resulted in
|
||||
discovering a new format being used. It seems (almost?) identical to the
|
||||
one known from ucode used in SoftMAC devices which is most likely the
|
||||
same codebase anyway.
|
||||
|
||||
While new firmwares will /announce/ radiotap header support using the
|
||||
"rtap" fw capability string it seems no string was added for the new
|
||||
ucode header format.
|
||||
|
||||
All above means that:
|
||||
1) We need new format support when dealing with a received frame
|
||||
2) A new feature bit & mapping quirks have to be added manually
|
||||
|
||||
As for now only an empty radiotap is being created. Adding support for
|
||||
extracting some info (band, channel, signal, etc.) is planned for the
|
||||
future.
|
||||
|
||||
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>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/core.c | 55 +++++++++++++++++++
|
||||
.../broadcom/brcm80211/brcmfmac/feature.c | 4 ++
|
||||
.../broadcom/brcm80211/brcmfmac/feature.h | 4 +-
|
||||
3 files changed, 62 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -43,6 +43,36 @@
|
||||
|
||||
#define BRCMF_BSSIDX_INVALID -1
|
||||
|
||||
+#define RXS_PBPRES BIT(2)
|
||||
+
|
||||
+#define D11_PHY_HDR_LEN 6
|
||||
+
|
||||
+struct d11rxhdr_le {
|
||||
+ __le16 RxFrameSize;
|
||||
+ u16 PAD;
|
||||
+ __le16 PhyRxStatus_0;
|
||||
+ __le16 PhyRxStatus_1;
|
||||
+ __le16 PhyRxStatus_2;
|
||||
+ __le16 PhyRxStatus_3;
|
||||
+ __le16 PhyRxStatus_4;
|
||||
+ __le16 PhyRxStatus_5;
|
||||
+ __le16 RxStatus1;
|
||||
+ __le16 RxStatus2;
|
||||
+ __le16 RxTSFTime;
|
||||
+ __le16 RxChan;
|
||||
+ u8 unknown[12];
|
||||
+} __packed;
|
||||
+
|
||||
+struct wlc_d11rxhdr {
|
||||
+ struct d11rxhdr_le rxhdr;
|
||||
+ __le32 tsf_l;
|
||||
+ s8 rssi;
|
||||
+ s8 rxpwr0;
|
||||
+ s8 rxpwr1;
|
||||
+ s8 do_rssi_ma;
|
||||
+ s8 rxpwr[4];
|
||||
+} __packed;
|
||||
+
|
||||
char *brcmf_ifname(struct brcmf_if *ifp)
|
||||
{
|
||||
if (!ifp)
|
||||
@@ -409,6 +439,31 @@ void brcmf_netif_mon_rx(struct brcmf_if
|
||||
{
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_RADIOTAP)) {
|
||||
/* Do nothing */
|
||||
+ } else if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR)) {
|
||||
+ struct wlc_d11rxhdr *wlc_rxhdr = (struct wlc_d11rxhdr *)skb->data;
|
||||
+ struct ieee80211_radiotap_header *radiotap;
|
||||
+ unsigned int offset;
|
||||
+ u16 RxStatus1;
|
||||
+
|
||||
+ RxStatus1 = le16_to_cpu(wlc_rxhdr->rxhdr.RxStatus1);
|
||||
+
|
||||
+ offset = sizeof(struct wlc_d11rxhdr);
|
||||
+ /* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU
|
||||
+ * subframes
|
||||
+ */
|
||||
+ if (RxStatus1 & RXS_PBPRES)
|
||||
+ offset += 2;
|
||||
+ offset += D11_PHY_HDR_LEN;
|
||||
+
|
||||
+ skb_pull(skb, offset);
|
||||
+
|
||||
+ /* TODO: use RX header to fill some radiotap data */
|
||||
+ radiotap = skb_push(skb, sizeof(*radiotap));
|
||||
+ memset(radiotap, 0, sizeof(*radiotap));
|
||||
+ radiotap->it_len = cpu_to_le16(sizeof(*radiotap));
|
||||
+
|
||||
+ /* TODO: 4 bytes with receive status? */
|
||||
+ skb->len -= 4;
|
||||
} else {
|
||||
struct ieee80211_radiotap_header *radiotap;
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -103,6 +103,10 @@ static const struct brcmf_feat_fwfeat br
|
||||
{ "01-6cb8e269", BIT(BRCMF_FEAT_MONITOR) },
|
||||
/* brcmfmac4366b-pcie.bin from linux-firmware.git commit 52442afee990 */
|
||||
{ "01-c47a91a4", BIT(BRCMF_FEAT_MONITOR) },
|
||||
+ /* brcmfmac4366b-pcie.bin from linux-firmware.git commit 211de1679a68 */
|
||||
+ { "01-801fb449", BIT(BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR) },
|
||||
+ /* brcmfmac4366c-pcie.bin from linux-firmware.git commit 211de1679a68 */
|
||||
+ { "01-d2cbb8fd", BIT(BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR) },
|
||||
};
|
||||
|
||||
static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
||||
@@ -35,6 +35,7 @@
|
||||
* FWSUP: Firmware supplicant.
|
||||
* MONITOR: firmware can pass monitor packets to host.
|
||||
* MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
|
||||
+ * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
|
||||
*/
|
||||
#define BRCMF_FEAT_LIST \
|
||||
BRCMF_FEAT_DEF(MBSS) \
|
||||
@@ -52,7 +53,8 @@
|
||||
BRCMF_FEAT_DEF(GSCAN) \
|
||||
BRCMF_FEAT_DEF(FWSUP) \
|
||||
BRCMF_FEAT_DEF(MONITOR) \
|
||||
- BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP)
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
|
||||
+ BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR)
|
||||
|
||||
/*
|
||||
* Quirks:
|
@ -0,0 +1,28 @@
|
||||
From 1b5e2423164b3670e8bc9174e4762d297990deff Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 14 Feb 2019 13:43:47 +0100
|
||||
Subject: [PATCH] brcmfmac: assure SSID length from firmware is limited
|
||||
|
||||
The SSID length as received from firmware should not exceed
|
||||
IEEE80211_MAX_SSID_LEN as that would result in heap overflow.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -3499,6 +3499,8 @@ brcmf_wowl_nd_results(struct brcmf_if *i
|
||||
}
|
||||
|
||||
netinfo = brcmf_get_netinfo_array(pfn_result);
|
||||
+ if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN)
|
||||
+ netinfo->SSID_len = IEEE80211_MAX_SSID_LEN;
|
||||
memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len);
|
||||
cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len;
|
||||
cfg->wowl.nd->n_channels = 1;
|
@ -0,0 +1,96 @@
|
||||
From a4176ec356c73a46c07c181c6d04039fafa34a9f Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 14 Feb 2019 13:43:48 +0100
|
||||
Subject: [PATCH] brcmfmac: add subtype check for event handling in data path
|
||||
|
||||
For USB there is no separate channel being used to pass events
|
||||
from firmware to the host driver and as such are passed over the
|
||||
data path. In order to detect mock event messages an additional
|
||||
check is needed on event subtype. This check is added conditionally
|
||||
using unlikely() keyword.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 5 +++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/fweh.h | 16 ++++++++++++----
|
||||
.../broadcom/brcm80211/brcmfmac/msgbuf.c | 2 +-
|
||||
3 files changed, 16 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -519,7 +519,8 @@ void brcmf_rx_frame(struct device *dev,
|
||||
} else {
|
||||
/* Process special event packets */
|
||||
if (handle_event)
|
||||
- brcmf_fweh_process_skb(ifp->drvr, skb);
|
||||
+ brcmf_fweh_process_skb(ifp->drvr, skb,
|
||||
+ BCMILCP_SUBTYPE_VENDOR_LONG);
|
||||
|
||||
brcmf_netif_rx(ifp, skb);
|
||||
}
|
||||
@@ -536,7 +537,7 @@ void brcmf_rx_event(struct device *dev,
|
||||
if (brcmf_rx_hdrpull(drvr, skb, &ifp))
|
||||
return;
|
||||
|
||||
- brcmf_fweh_process_skb(ifp->drvr, skb);
|
||||
+ brcmf_fweh_process_skb(ifp->drvr, skb, 0);
|
||||
brcmu_pkt_buf_free_skb(skb);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
|
||||
@@ -211,7 +211,7 @@ enum brcmf_fweh_event_code {
|
||||
*/
|
||||
#define BRCM_OUI "\x00\x10\x18"
|
||||
#define BCMILCP_BCM_SUBTYPE_EVENT 1
|
||||
-
|
||||
+#define BCMILCP_SUBTYPE_VENDOR_LONG 32769
|
||||
|
||||
/**
|
||||
* struct brcm_ethhdr - broadcom specific ether header.
|
||||
@@ -334,10 +334,10 @@ void brcmf_fweh_process_event(struct brc
|
||||
void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing);
|
||||
|
||||
static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
|
||||
- struct sk_buff *skb)
|
||||
+ struct sk_buff *skb, u16 stype)
|
||||
{
|
||||
struct brcmf_event *event_packet;
|
||||
- u16 usr_stype;
|
||||
+ u16 subtype, usr_stype;
|
||||
|
||||
/* only process events when protocol matches */
|
||||
if (skb->protocol != cpu_to_be16(ETH_P_LINK_CTL))
|
||||
@@ -346,8 +346,16 @@ static inline void brcmf_fweh_process_sk
|
||||
if ((skb->len + ETH_HLEN) < sizeof(*event_packet))
|
||||
return;
|
||||
|
||||
- /* check for BRCM oui match */
|
||||
event_packet = (struct brcmf_event *)skb_mac_header(skb);
|
||||
+
|
||||
+ /* check subtype if needed */
|
||||
+ if (unlikely(stype)) {
|
||||
+ subtype = get_unaligned_be16(&event_packet->hdr.subtype);
|
||||
+ if (subtype != stype)
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* check for BRCM oui match */
|
||||
if (memcmp(BRCM_OUI, &event_packet->hdr.oui[0],
|
||||
sizeof(event_packet->hdr.oui)))
|
||||
return;
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -1116,7 +1116,7 @@ static void brcmf_msgbuf_process_event(s
|
||||
|
||||
skb->protocol = eth_type_trans(skb, ifp->ndev);
|
||||
|
||||
- brcmf_fweh_process_skb(ifp->drvr, skb);
|
||||
+ brcmf_fweh_process_skb(ifp->drvr, skb, 0);
|
||||
|
||||
exit:
|
||||
brcmu_pkt_buf_free_skb(skb);
|
@ -0,0 +1,101 @@
|
||||
From aaf6a5e86e36766abbeedf220462bde8031f9a72 Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 14 Feb 2019 13:43:49 +0100
|
||||
Subject: [PATCH] brcmfmac: create debugfs files for bus-specific layer
|
||||
|
||||
Since we moved the drivers debugfs directory under ieee80211 debugfs the
|
||||
debugfs entries need to be added after wiphy_register() has been called.
|
||||
For most part that has been done accordingly, but for the debugfs entries
|
||||
added by SDIO it was not and failed silently. This patch fixes that by
|
||||
adding a bus-layer callback for it.
|
||||
|
||||
Fixes: 856d5a011c86 ("brcmfmac: allocate struct brcmf_pub instance using wiphy_new()")
|
||||
Reported-by: Russel King <linux@armlinux.org.uk>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 10 ++++++++++
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 1 +
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 +++++++-----
|
||||
3 files changed, 18 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -90,6 +90,7 @@ struct brcmf_bus_ops {
|
||||
int (*get_memdump)(struct device *dev, void *data, size_t len);
|
||||
int (*get_fwname)(struct device *dev, const char *ext,
|
||||
unsigned char *fw_name);
|
||||
+ void (*debugfs_create)(struct device *dev);
|
||||
};
|
||||
|
||||
|
||||
@@ -235,6 +236,15 @@ int brcmf_bus_get_fwname(struct brcmf_bu
|
||||
return bus->ops->get_fwname(bus->dev, ext, fw_name);
|
||||
}
|
||||
|
||||
+static inline
|
||||
+void brcmf_bus_debugfs_create(struct brcmf_bus *bus)
|
||||
+{
|
||||
+ if (!bus->ops->debugfs_create)
|
||||
+ return;
|
||||
+
|
||||
+ return bus->ops->debugfs_create(bus->dev);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* interface functions from common layer
|
||||
*/
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1177,6 +1177,7 @@ static int brcmf_bus_started(struct brcm
|
||||
brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
|
||||
brcmf_feat_debugfs_create(drvr);
|
||||
brcmf_proto_debugfs_create(drvr);
|
||||
+ brcmf_bus_debugfs_create(bus_if);
|
||||
|
||||
return 0;
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -3143,9 +3143,12 @@ static int brcmf_debugfs_sdio_count_read
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
|
||||
+static void brcmf_sdio_debugfs_create(struct device *dev)
|
||||
{
|
||||
- struct brcmf_pub *drvr = bus->sdiodev->bus_if->drvr;
|
||||
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
+ struct brcmf_pub *drvr = bus_if->drvr;
|
||||
+ struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
|
||||
+ struct brcmf_sdio *bus = sdiodev->bus;
|
||||
struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
|
||||
|
||||
if (IS_ERR_OR_NULL(dentry))
|
||||
@@ -3165,7 +3168,7 @@ static int brcmf_sdio_checkdied(struct b
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
|
||||
+static void brcmf_sdio_debugfs_create(struct device *dev)
|
||||
{
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
@@ -3477,8 +3480,6 @@ static int brcmf_sdio_bus_preinit(struct
|
||||
if (bus->rxbuf)
|
||||
bus->rxblen = value;
|
||||
|
||||
- brcmf_sdio_debugfs_create(bus);
|
||||
-
|
||||
/* the commands below use the terms tx and rx from
|
||||
* a device perspective, ie. bus:txglom affects the
|
||||
* bus transfers from device to host.
|
||||
@@ -4088,6 +4089,7 @@ static const struct brcmf_bus_ops brcmf_
|
||||
.get_ramsize = brcmf_sdio_bus_get_ramsize,
|
||||
.get_memdump = brcmf_sdio_bus_get_memdump,
|
||||
.get_fwname = brcmf_sdio_get_fwname,
|
||||
+ .debugfs_create = brcmf_sdio_debugfs_create
|
||||
};
|
||||
|
||||
#define BRCMF_SDIO_FW_CODE 0
|
@ -0,0 +1,41 @@
|
||||
From 92d3b88b1029c46f9bf27302c502dc0e3541805b Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 14 Feb 2019 13:43:50 +0100
|
||||
Subject: [PATCH] brcmfmac: disable MBSS feature for bcm4330 device
|
||||
|
||||
The MBSS feature was already disabled for bcm43362 as it resulted in a
|
||||
beacon with BRCM_TEST_SSID regardless user configuration in hostapd. Now
|
||||
the same has been reported for bcm4330 so disable the feature for this
|
||||
device as well.
|
||||
|
||||
Reported-by: Russell King <linux@armlinux.org.uk>
|
||||
Tested-by: Christopher Martin <chrsmrtn@gmail.com>
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||||
@@ -272,9 +272,15 @@ void brcmf_feat_attach(struct brcmf_pub
|
||||
BIT(BRCMF_FEAT_WOWL_GTK);
|
||||
}
|
||||
}
|
||||
- /* MBSS does not work for 43362 */
|
||||
- if (drvr->bus_if->chip == BRCM_CC_43362_CHIP_ID)
|
||||
+ /* MBSS does not work for all chips */
|
||||
+ switch (drvr->bus_if->chip) {
|
||||
+ case BRCM_CC_4330_CHIP_ID:
|
||||
+ case BRCM_CC_43362_CHIP_ID:
|
||||
ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_MBSS);
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
|
||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp");
|
@ -0,0 +1,121 @@
|
||||
From 4ab2cf03da91785f2c34d79a302e53da06928bc1 Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 14 Feb 2019 13:43:51 +0100
|
||||
Subject: [PATCH] brcmfmac: check and dump trap info during sdio probe
|
||||
|
||||
When the firmware crashes during the probe sequence we provide little
|
||||
information on what really failed. This patch checks the sdpcm shared
|
||||
location and show the trap information if a firmware trap has happened.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 59 +++++++++++++------
|
||||
1 file changed, 40 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -2999,21 +2999,35 @@ static int brcmf_sdio_trap_info(struct s
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
- seq_printf(seq,
|
||||
- "dongle trap info: type 0x%x @ epc 0x%08x\n"
|
||||
- " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
|
||||
- " lr 0x%08x pc 0x%08x offset 0x%x\n"
|
||||
- " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
|
||||
- " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
|
||||
- le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
|
||||
- le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
|
||||
- le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
|
||||
- le32_to_cpu(tr.pc), sh->trap_addr,
|
||||
- le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
|
||||
- le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
|
||||
- le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
|
||||
- le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
|
||||
-
|
||||
+ if (seq)
|
||||
+ seq_printf(seq,
|
||||
+ "dongle trap info: type 0x%x @ epc 0x%08x\n"
|
||||
+ " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
|
||||
+ " lr 0x%08x pc 0x%08x offset 0x%x\n"
|
||||
+ " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
|
||||
+ " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
|
||||
+ le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
|
||||
+ le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
|
||||
+ le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
|
||||
+ le32_to_cpu(tr.pc), sh->trap_addr,
|
||||
+ le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
|
||||
+ le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
|
||||
+ le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
|
||||
+ le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
|
||||
+ else
|
||||
+ pr_debug("dongle trap info: type 0x%x @ epc 0x%08x\n"
|
||||
+ " cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
|
||||
+ " lr 0x%08x pc 0x%08x offset 0x%x\n"
|
||||
+ " r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n"
|
||||
+ " r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n",
|
||||
+ le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
|
||||
+ le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
|
||||
+ le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
|
||||
+ le32_to_cpu(tr.pc), sh->trap_addr,
|
||||
+ le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
|
||||
+ le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
|
||||
+ le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
|
||||
+ le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3067,8 +3081,10 @@ static int brcmf_sdio_checkdied(struct b
|
||||
else if (sh.flags & SDPCM_SHARED_ASSERT)
|
||||
brcmf_err("assertion in dongle\n");
|
||||
|
||||
- if (sh.flags & SDPCM_SHARED_TRAP)
|
||||
+ if (sh.flags & SDPCM_SHARED_TRAP) {
|
||||
brcmf_err("firmware trap in dongle\n");
|
||||
+ brcmf_sdio_trap_info(NULL, bus, &sh);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -4199,7 +4215,7 @@ static void brcmf_sdio_firmware_callback
|
||||
} else {
|
||||
/* Disable F2 again */
|
||||
sdio_disable_func(sdiod->func2);
|
||||
- goto release;
|
||||
+ goto checkdied;
|
||||
}
|
||||
|
||||
if (brcmf_chip_sr_capable(bus->ci)) {
|
||||
@@ -4220,8 +4236,10 @@ static void brcmf_sdio_firmware_callback
|
||||
}
|
||||
|
||||
/* If we didn't come up, turn off backplane clock */
|
||||
- if (err != 0)
|
||||
+ if (err != 0) {
|
||||
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
||||
+ goto checkdied;
|
||||
+ }
|
||||
|
||||
sdio_release_host(sdiod->func1);
|
||||
|
||||
@@ -4235,12 +4253,15 @@ static void brcmf_sdio_firmware_callback
|
||||
err = brcmf_attach(sdiod->dev, sdiod->settings);
|
||||
if (err != 0) {
|
||||
brcmf_err("brcmf_attach failed\n");
|
||||
- goto fail;
|
||||
+ sdio_claim_host(sdiod->func1);
|
||||
+ goto checkdied;
|
||||
}
|
||||
|
||||
/* ready */
|
||||
return;
|
||||
|
||||
+checkdied:
|
||||
+ brcmf_sdio_checkdied(bus);
|
||||
release:
|
||||
sdio_release_host(sdiod->func1);
|
||||
fail:
|
@ -0,0 +1,42 @@
|
||||
From a250c91c1762e85c736e67cb4a9a95ebae72e62d Mon Sep 17 00:00:00 2001
|
||||
From: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Date: Thu, 14 Feb 2019 13:43:52 +0100
|
||||
Subject: [PATCH] brcmfmac: use chipname in brcmf_fw_alloc_request() for error
|
||||
path as well
|
||||
|
||||
The local variable chipname is string representation of chip id and revision
|
||||
which is printed in the good flow of brcmf_fw_alloc_request(). Also use it
|
||||
for the error path, ie. for unknown/unsupported devices.
|
||||
|
||||
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
|
||||
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -719,8 +719,10 @@ brcmf_fw_alloc_request(u32 chip, u32 chi
|
||||
break;
|
||||
}
|
||||
|
||||
+ brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
|
||||
+
|
||||
if (i == table_size) {
|
||||
- brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
|
||||
+ brcmf_err("Unknown chip %s\n", chipname);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -729,8 +731,6 @@ brcmf_fw_alloc_request(u32 chip, u32 chi
|
||||
if (!fwreq)
|
||||
return NULL;
|
||||
|
||||
- brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
|
||||
-
|
||||
brcmf_info("using %s for chip %s\n",
|
||||
mapping_table[i].fw_base, chipname);
|
||||
|
@ -0,0 +1,67 @@
|
||||
From c988b78244df8216902e20de536434e2f474a37e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 8 Feb 2019 15:24:39 +0100
|
||||
Subject: [PATCH] brcmfmac: print firmware reported ring status errors
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Firmware is capable of reporting ring status. It's used e.g. to signal
|
||||
some problem with a specific ring setup. This patch adds support for
|
||||
printing ring & error number which may be useful for debugging setup
|
||||
issues.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/msgbuf.c | 25 +++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
|
||||
@@ -134,6 +134,14 @@ struct msgbuf_completion_hdr {
|
||||
__le16 flow_ring_id;
|
||||
};
|
||||
|
||||
+/* Data struct for the MSGBUF_TYPE_RING_STATUS */
|
||||
+struct msgbuf_ring_status {
|
||||
+ struct msgbuf_common_hdr msg;
|
||||
+ struct msgbuf_completion_hdr compl_hdr;
|
||||
+ __le16 write_idx;
|
||||
+ __le32 rsvd0[5];
|
||||
+};
|
||||
+
|
||||
struct msgbuf_rx_event {
|
||||
struct msgbuf_common_hdr msg;
|
||||
struct msgbuf_completion_hdr compl_hdr;
|
||||
@@ -1180,6 +1188,19 @@ brcmf_msgbuf_process_rx_complete(struct
|
||||
brcmf_netif_rx(ifp, skb);
|
||||
}
|
||||
|
||||
+static void brcmf_msgbuf_process_ring_status(struct brcmf_msgbuf *msgbuf,
|
||||
+ void *buf)
|
||||
+{
|
||||
+ struct msgbuf_ring_status *ring_status = buf;
|
||||
+ int err;
|
||||
+
|
||||
+ err = le16_to_cpu(ring_status->compl_hdr.status);
|
||||
+ if (err) {
|
||||
+ int ring = le16_to_cpu(ring_status->compl_hdr.flow_ring_id);
|
||||
+
|
||||
+ brcmf_err("Firmware reported ring %d error: %d\n", ring, err);
|
||||
+ }
|
||||
+}
|
||||
|
||||
static void
|
||||
brcmf_msgbuf_process_flow_ring_create_response(struct brcmf_msgbuf *msgbuf,
|
||||
@@ -1241,6 +1262,10 @@ static void brcmf_msgbuf_process_msgtype
|
||||
|
||||
msg = (struct msgbuf_common_hdr *)buf;
|
||||
switch (msg->msgtype) {
|
||||
+ case MSGBUF_TYPE_RING_STATUS:
|
||||
+ brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RING_STATUS\n");
|
||||
+ brcmf_msgbuf_process_ring_status(msgbuf, buf);
|
||||
+ break;
|
||||
case MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT:
|
||||
brcmf_dbg(MSGBUF, "MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT\n");
|
||||
brcmf_msgbuf_process_flow_ring_create_response(msgbuf, buf);
|
@ -0,0 +1,42 @@
|
||||
From f4e183293b871c96c0220dcc549d5ca4c72628ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 11 Feb 2019 23:04:53 +0100
|
||||
Subject: [PATCH] brcmfmac: improve code handling bandwidth of firmware
|
||||
reported channels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1) Use switch to simplify/improve the code & avoid some duplication
|
||||
2) Add warning for unsupported values
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6043,11 +6043,18 @@ static int brcmf_construct_chaninfo(stru
|
||||
/* assuming the chanspecs order is HT20,
|
||||
* HT40 upper, HT40 lower, and VHT80.
|
||||
*/
|
||||
- if (ch.bw == BRCMU_CHAN_BW_80) {
|
||||
+ switch (ch.bw) {
|
||||
+ case BRCMU_CHAN_BW_80:
|
||||
channel->flags &= ~IEEE80211_CHAN_NO_80MHZ;
|
||||
- } else if (ch.bw == BRCMU_CHAN_BW_40) {
|
||||
+ break;
|
||||
+ case BRCMU_CHAN_BW_40:
|
||||
brcmf_update_bw40_channel_flag(channel, &ch);
|
||||
- } else {
|
||||
+ break;
|
||||
+ default:
|
||||
+ wiphy_warn(wiphy, "Firmware reported unsupported bandwidth %d\n",
|
||||
+ ch.bw);
|
||||
+ /* fall through */
|
||||
+ case BRCMU_CHAN_BW_20:
|
||||
/* enable the channel and disable other bandwidths
|
||||
* for now as mentioned order assure they are enabled
|
||||
* for subsequent chanspecs.
|
@ -0,0 +1,30 @@
|
||||
From 30519cbe339a45bd11a57ca8ece07f4f6a1cda2e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Mon, 11 Feb 2019 23:04:54 +0100
|
||||
Subject: [PATCH] brcmfmac: support firmware reporting 160 MHz channels
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far 160 MHz channels were treated as 20 MHz ones which was breaking
|
||||
support for 40/80 MHz due to the brcmf_construct_chaninfo() logic and
|
||||
its assumptions.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -6044,6 +6044,9 @@ static int brcmf_construct_chaninfo(stru
|
||||
* HT40 upper, HT40 lower, and VHT80.
|
||||
*/
|
||||
switch (ch.bw) {
|
||||
+ case BRCMU_CHAN_BW_160:
|
||||
+ channel->flags &= ~IEEE80211_CHAN_NO_160MHZ;
|
||||
+ break;
|
||||
case BRCMU_CHAN_BW_80:
|
||||
channel->flags &= ~IEEE80211_CHAN_NO_80MHZ;
|
||||
break;
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,38 @@
|
||||
From e4d1b2716b8859199c28f2ac5f984bd05a146a6b Mon Sep 17 00:00:00 2001
|
||||
From: YueHaibing <yuehaibing@huawei.com>
|
||||
Date: Mon, 18 Feb 2019 08:08:46 +0000
|
||||
Subject: [PATCH] brcmfmac: remove set but not used variable 'old_state'
|
||||
|
||||
Fixes gcc '-Wunused-but-set-variable' warning:
|
||||
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c: In function 'brcmf_usb_state_change':
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c:578:6: warning:
|
||||
variable 'old_state' set but not used [-Wunused-but-set-variable]
|
||||
|
||||
It's never used and can be removed.
|
||||
|
||||
Signed-off-by: YueHaibing <yuehaibing@huawei.com>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -575,7 +575,6 @@ static void
|
||||
brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state)
|
||||
{
|
||||
struct brcmf_bus *bcmf_bus = devinfo->bus_pub.bus;
|
||||
- int old_state;
|
||||
|
||||
brcmf_dbg(USB, "Enter, current state=%d, new state=%d\n",
|
||||
devinfo->bus_pub.state, state);
|
||||
@@ -583,7 +582,6 @@ brcmf_usb_state_change(struct brcmf_usbd
|
||||
if (devinfo->bus_pub.state == state)
|
||||
return;
|
||||
|
||||
- old_state = devinfo->bus_pub.state;
|
||||
devinfo->bus_pub.state = state;
|
||||
|
||||
/* update state of upper layer */
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,38 @@
|
||||
From e0a8ef4d7b4315bc4c1641fb3f3a7dfdfa6627b8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 20 Feb 2019 11:30:47 +0100
|
||||
Subject: [PATCH] brcmfmac: add basic validation of shared RAM address
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
While experimenting with firmware loading I ended up in a state of
|
||||
firmware reporting shared RAM address 0x04000001. It was causing:
|
||||
[ 94.448015] Unable to handle kernel paging request at virtual address cd680001
|
||||
due to reading out of the mapped memory.
|
||||
|
||||
This patch adds some basic validation to avoid kernel crashes due to the
|
||||
unexpected firmware behavior.
|
||||
|
||||
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/pcie.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1560,6 +1560,12 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
brcmf_err(bus, "FW failed to initialize\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
+ if (sharedram_addr < devinfo->ci->rambase ||
|
||||
+ sharedram_addr >= devinfo->ci->rambase + devinfo->ci->ramsize) {
|
||||
+ brcmf_err(bus, "Invalid shared RAM address 0x%08x\n",
|
||||
+ sharedram_addr);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
|
||||
|
||||
return (brcmf_pcie_init_share_ram_info(devinfo, sharedram_addr));
|
@ -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
|
||||
@@ -1347,6 +1347,7 @@ int __init brcmf_core_init(void)
|
||||
@@ -1408,6 +1408,7 @@ int __init brcmf_core_init(void)
|
||||
{
|
||||
if (!schedule_work(&brcmf_driver_work))
|
||||
return -EBUSY;
|
||||
@ -40,15 +40,16 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
kfree(fwctx);
|
||||
}
|
||||
|
||||
@@ -673,6 +676,7 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -673,6 +676,8 @@ int brcmf_fw_get_firmwares(struct device
|
||||
{
|
||||
struct brcmf_fw_item *first = &req->items[0];
|
||||
struct brcmf_fw *fwctx;
|
||||
+ struct completion completion;
|
||||
+ unsigned long time_left;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
@@ -689,6 +693,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -689,6 +694,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
fwctx->dev = dev;
|
||||
fwctx->req = req;
|
||||
fwctx->done = fw_cb;
|
||||
@ -58,11 +59,14 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
@@ -696,6 +703,9 @@ int brcmf_fw_get_firmwares(struct device
|
||||
@@ -696,6 +704,12 @@ int brcmf_fw_get_firmwares(struct device
|
||||
if (ret < 0)
|
||||
brcmf_fw_request_done(NULL, fwctx);
|
||||
|
||||
+ wait_for_completion_timeout(fwctx->completion, msecs_to_jiffies(5000));
|
||||
+
|
||||
+ time_left = wait_for_completion_timeout(&completion,
|
||||
+ msecs_to_jiffies(5000));
|
||||
+ if (!time_left && fwctx)
|
||||
+ fwctx->completion = NULL;
|
||||
+
|
||||
return 0;
|
||||
|
@ -10,12 +10,11 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -614,9 +614,37 @@ static struct wireless_dev *brcmf_cfg802
|
||||
enum nl80211_iftype type,
|
||||
struct vif_params *params)
|
||||
{
|
||||
+ struct net_device *dev;
|
||||
@@ -620,8 +620,36 @@ static struct wireless_dev *brcmf_cfg802
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct wireless_dev *wdev;
|
||||
+ struct net_device *dev;
|
||||
int err;
|
||||
|
||||
+ /*
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -2725,6 +2725,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
@@ -2774,6 +2774,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -395,43 +395,6 @@ USB_IPHETH=
|
||||
@@ -396,43 +396,6 @@ USB_IPHETH=
|
||||
USB_SIERRA_NET=
|
||||
USB_VL600=
|
||||
USB_NET_CH9200=
|
||||
@ -192,7 +192,7 @@
|
||||
select BRCMUTIL
|
||||
--- a/Kconfig.local
|
||||
+++ b/Kconfig.local
|
||||
@@ -1189,117 +1189,6 @@ config BACKPORTED_USB_VL600
|
||||
@@ -1192,117 +1192,6 @@ config BACKPORTED_USB_VL600
|
||||
config BACKPORTED_USB_NET_CH9200
|
||||
tristate
|
||||
default USB_NET_CH9200
|
||||
|
@ -0,0 +1,59 @@
|
||||
From f483039cf51acf30494cd754194562c22cf98764 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Wed, 22 Aug 2018 13:41:26 +0300
|
||||
Subject: [PATCH 01/28] rt2x00: use simple_read_from_buffer()
|
||||
|
||||
The problem with this copy_to_user() calls is that they don't ensure
|
||||
that "size" is less than the "length" which the user provided.
|
||||
|
||||
Obviously, this is debugfs and "size" is normally going to be very small
|
||||
so it probably doesn't matter, but this is the correct thing to do.
|
||||
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Acked-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2x00debug.c | 18 +++---------------
|
||||
1 file changed, 3 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
|
||||
@@ -464,11 +464,7 @@ static ssize_t rt2x00debug_read_##__name
|
||||
\
|
||||
size = sprintf(line, __format, value); \
|
||||
\
|
||||
- if (copy_to_user(buf, line, size)) \
|
||||
- return -EFAULT; \
|
||||
- \
|
||||
- *offset += size; \
|
||||
- return size; \
|
||||
+ return simple_read_from_buffer(buf, length, offset, line, size); \
|
||||
}
|
||||
|
||||
#define RT2X00DEBUGFS_OPS_WRITE(__name, __type) \
|
||||
@@ -545,11 +541,7 @@ static ssize_t rt2x00debug_read_dev_flag
|
||||
|
||||
size = sprintf(line, "0x%.8x\n", (unsigned int)intf->rt2x00dev->flags);
|
||||
|
||||
- if (copy_to_user(buf, line, size))
|
||||
- return -EFAULT;
|
||||
-
|
||||
- *offset += size;
|
||||
- return size;
|
||||
+ return simple_read_from_buffer(buf, length, offset, line, size);
|
||||
}
|
||||
|
||||
static const struct file_operations rt2x00debug_fop_dev_flags = {
|
||||
@@ -574,11 +566,7 @@ static ssize_t rt2x00debug_read_cap_flag
|
||||
|
||||
size = sprintf(line, "0x%.8x\n", (unsigned int)intf->rt2x00dev->cap_flags);
|
||||
|
||||
- if (copy_to_user(buf, line, size))
|
||||
- return -EFAULT;
|
||||
-
|
||||
- *offset += size;
|
||||
- return size;
|
||||
+ return simple_read_from_buffer(buf, length, offset, line, size);
|
||||
}
|
||||
|
||||
static const struct file_operations rt2x00debug_fop_cap_flags = {
|
@ -1,13 +1,14 @@
|
||||
From 0381bfbc400ce4c3000b0b31c577ad9e8071e4f6 Mon Sep 17 00:00:00 2001
|
||||
From 5c656c71b1bf5611ce8262bab338104e04d10b8d Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Fri, 18 May 2018 12:25:08 +0200
|
||||
Subject: [PATCH 1/5] rt2800: move usb specific txdone/txstatus routines to
|
||||
Date: Wed, 26 Sep 2018 12:24:53 +0200
|
||||
Subject: [PATCH 02/28] rt2800: move usb specific txdone/txstatus routines to
|
||||
rt2800lib
|
||||
|
||||
In order to reuse usb txdone/txstatus routines for mmio, move them
|
||||
to common rt2800lib.c file.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 138 +++++++++++++++++
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.h | 3 +
|
||||
@ -16,7 +17,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -960,6 +960,47 @@ static void rt2800_rate_from_status(stru
|
||||
@@ -957,6 +957,47 @@ static void rt2800_rate_from_status(stru
|
||||
skbdesc->tx_rate_flags = flags;
|
||||
}
|
||||
|
||||
@ -64,7 +65,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
|
||||
bool match)
|
||||
{
|
||||
@@ -1062,6 +1103,103 @@ void rt2800_txdone_entry(struct queue_en
|
||||
@@ -1059,6 +1100,103 @@ void rt2800_txdone_entry(struct queue_en
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
|
||||
|
||||
@ -170,7 +171,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
{
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
@@ -206,6 +206,9 @@ void rt2800_process_rxwi(struct queue_en
|
||||
@@ -195,6 +195,9 @@ void rt2800_process_rxwi(struct queue_en
|
||||
|
||||
void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
|
||||
bool match);
|
@ -1,7 +1,7 @@
|
||||
From 7993486bbab17f8916993710a8660eb47fd991e9 Mon Sep 17 00:00:00 2001
|
||||
From 0b0d556e0ebb6c966bc993e21a22a156812d8fdf Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Mon, 9 Jul 2018 16:07:42 +0200
|
||||
Subject: [PATCH 2/5] rt2800mmio: use txdone/txstatus routines from lib
|
||||
Date: Wed, 26 Sep 2018 12:24:54 +0200
|
||||
Subject: [PATCH 03/28] rt2800mmio: use txdone/txstatus routines from lib
|
||||
|
||||
Use usb txdone/txstatus routines (now in rt2800libc) for mmio devices.
|
||||
|
||||
@ -14,6 +14,7 @@ allow to miss some tx statuses. However this will be improved in further
|
||||
patch where I also implement read status FIFO register in the tasklet.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 180 +-----------------
|
||||
.../net/wireless/ralink/rt2x00/rt2x00queue.c | 1 +
|
@ -1,13 +1,14 @@
|
||||
From b5d6e37ea15949a126907050d8cfa4408153a0cd Mon Sep 17 00:00:00 2001
|
||||
From 5022efb50f625d11fdf18b1fee0f64ebb1863664 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Fri, 18 May 2018 12:25:10 +0200
|
||||
Subject: [PATCH 3/5] rt2x00: do not check for txstatus timeout every time on
|
||||
Date: Wed, 26 Sep 2018 12:24:55 +0200
|
||||
Subject: [PATCH 04/28] rt2x00: do not check for txstatus timeout every time on
|
||||
tasklet
|
||||
|
||||
Do not check for tx status timeout everytime we perform txstatus tasklet.
|
||||
Perform check once per half a second.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 7 +++++++
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 3 ++-
|
||||
@ -17,7 +18,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1161,11 +1161,18 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
@@ -1158,11 +1158,18 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
struct data_queue *queue;
|
||||
struct queue_entry *entry;
|
||||
|
||||
@ -50,7 +51,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
rt2800mmio_enable_interrupt(rt2x00dev,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -988,6 +988,8 @@ struct rt2x00_dev {
|
||||
@@ -980,6 +980,8 @@ struct rt2x00_dev {
|
||||
*/
|
||||
DECLARE_KFIFO_PTR(txstatus_fifo, u32);
|
||||
|
@ -1,7 +1,7 @@
|
||||
From feb87977b6d251fb01a329905719e45908f6c939 Mon Sep 17 00:00:00 2001
|
||||
From adf26a356f132e35093585521ea3e36cd185af83 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Fri, 10 Aug 2018 12:31:55 +0200
|
||||
Subject: [PATCH 4/5] rt2x00: use different txstatus timeouts when flushing
|
||||
Date: Wed, 26 Sep 2018 12:24:56 +0200
|
||||
Subject: [PATCH 05/28] rt2x00: use different txstatus timeouts when flushing
|
||||
|
||||
Use different tx status timeouts for normal operation and when flushing.
|
||||
This increase timeout to 2s for normal operation as when there are bad
|
||||
@ -10,6 +10,7 @@ the status for quite long. With new timeout we can still get valid status
|
||||
on such bad conditions.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 31 +++++++++++++------
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 +
|
||||
@ -18,7 +19,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1140,36 +1140,47 @@ void rt2800_txdone(struct rt2x00_dev *rt
|
||||
@@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_txdone);
|
||||
|
||||
@ -75,7 +76,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1198,7 +1209,7 @@ void rt2800_txdone_nostatus(struct rt2x0
|
||||
@@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x0
|
||||
break;
|
||||
|
||||
if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
|
||||
@ -86,7 +87,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
break;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -667,6 +667,7 @@ enum rt2x00_state_flags {
|
||||
@@ -665,6 +665,7 @@ enum rt2x00_state_flags {
|
||||
DEVICE_STATE_STARTED,
|
||||
DEVICE_STATE_ENABLED_RADIO,
|
||||
DEVICE_STATE_SCANNING,
|
@ -1,22 +1,23 @@
|
||||
From 0d9fbb738a5eadc7abc8060f43ebcc71f6324c07 Mon Sep 17 00:00:00 2001
|
||||
From 0240564430c0697d8fde3743d70346a922466b36 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Tue, 14 Aug 2018 08:58:48 +0200
|
||||
Subject: [PATCH 5/5] rt2800: flush and txstatus rework for rt2800mmio
|
||||
Date: Wed, 26 Sep 2018 12:24:57 +0200
|
||||
Subject: [PATCH 06/28] rt2800: flush and txstatus rework for rt2800mmio
|
||||
|
||||
Implement custom rt2800mmio flush routine and change txstatus
|
||||
routine to read TX_STA_FIFO also in the tasklet.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 14 +-
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 120 +++++++++++++-----
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 14 +--
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 118 +++++++++++++-----
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.h | 1 +
|
||||
.../net/wireless/ralink/rt2x00/rt2800pci.c | 2 +-
|
||||
4 files changed, 99 insertions(+), 38 deletions(-)
|
||||
4 files changed, 97 insertions(+), 38 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1150,7 +1150,7 @@ static inline bool rt2800_entry_txstatus
|
||||
@@ -1147,7 +1147,7 @@ static inline bool rt2800_entry_txstatus
|
||||
return false;
|
||||
|
||||
if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
|
||||
@ -25,7 +26,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
else
|
||||
tout = msecs_to_jiffies(2000);
|
||||
|
||||
@@ -1166,15 +1166,13 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
@@ -1163,15 +1163,13 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
{
|
||||
struct data_queue *queue;
|
||||
struct queue_entry *entry;
|
||||
@ -160,7 +161,7 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
|
||||
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT))
|
||||
tasklet_hi_schedule(&rt2x00dev->pretbtt_tasklet);
|
||||
@@ -453,6 +466,55 @@ void rt2800mmio_kick_queue(struct data_q
|
||||
@@ -453,6 +466,53 @@ void rt2800mmio_kick_queue(struct data_q
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_kick_queue);
|
||||
|
||||
@ -170,8 +171,6 @@ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
+ bool tx_queue = false;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ //printk("FLUSH queue %d len %d drop %d\n", queue->qid, queue->length, drop);
|
||||
+
|
||||
+ switch (queue->qid) {
|
||||
+ case QID_AC_VO:
|
||||
+ case QID_AC_VI:
|
@ -0,0 +1,25 @@
|
||||
From 6eba8fd2235237784dfd01da55c3210d493aebdb Mon Sep 17 00:00:00 2001
|
||||
From: "Gustavo A. R. Silva" <gustavo@embeddedor.com>
|
||||
Date: Mon, 22 Oct 2018 22:44:34 +0200
|
||||
Subject: [PATCH 07/28] rt2x00: rt2400pci: mark expected switch fall-through
|
||||
|
||||
In preparation to enabling -Wimplicit-fallthrough, mark switch cases
|
||||
where we are expecting to fall through.
|
||||
|
||||
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2400pci.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
|
||||
@@ -1302,7 +1302,7 @@ static void rt2400pci_txdone(struct rt2x
|
||||
break;
|
||||
case 2: /* Failure, excessive retries */
|
||||
__set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags);
|
||||
- /* Don't break, this is a failed frame! */
|
||||
+ /* Fall through - this is a failed frame! */
|
||||
default: /* Failure */
|
||||
__set_bit(TXDONE_FAILURE, &txdesc.flags);
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
From 10bb92217747c3384a01ebec005faa2f5e72bbd8 Mon Sep 17 00:00:00 2001
|
||||
From: "Gustavo A. R. Silva" <gustavo@embeddedor.com>
|
||||
Date: Mon, 22 Oct 2018 22:45:19 +0200
|
||||
Subject: [PATCH 08/28] rt2x00: rt2500pci: mark expected switch fall-through
|
||||
|
||||
In preparation to enabling -Wimplicit-fallthrough, mark switch cases
|
||||
where we are expecting to fall through.
|
||||
|
||||
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2500pci.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
|
||||
@@ -1430,7 +1430,7 @@ static void rt2500pci_txdone(struct rt2x
|
||||
break;
|
||||
case 2: /* Failure, excessive retries */
|
||||
__set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags);
|
||||
- /* Don't break, this is a failed frame! */
|
||||
+ /* Fall through - this is a failed frame! */
|
||||
default: /* Failure */
|
||||
__set_bit(TXDONE_FAILURE, &txdesc.flags);
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
From 916e6bbcfcff6cc5d7d33bba8557a30f3af50326 Mon Sep 17 00:00:00 2001
|
||||
From: "Gustavo A. R. Silva" <gustavo@embeddedor.com>
|
||||
Date: Mon, 22 Oct 2018 22:46:03 +0200
|
||||
Subject: [PATCH 09/28] rt2x00: rt2800lib: mark expected switch fall-throughs
|
||||
|
||||
In preparation to enabling -Wimplicit-fallthrough, mark switch cases
|
||||
where we are expecting to fall through.
|
||||
|
||||
Addresses-Coverity-ID: 145198 ("Missing break in switch")
|
||||
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -2482,6 +2482,7 @@ static void rt2800_config_channel_rf3052
|
||||
switch (rt2x00dev->default_ant.tx_chain_num) {
|
||||
case 1:
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
|
||||
+ /* fall through */
|
||||
case 2:
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
|
||||
break;
|
||||
@@ -2490,6 +2491,7 @@ static void rt2800_config_channel_rf3052
|
||||
switch (rt2x00dev->default_ant.rx_chain_num) {
|
||||
case 1:
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
|
||||
+ /* fall through */
|
||||
case 2:
|
||||
rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
|
||||
break;
|
||||
@@ -9457,8 +9459,10 @@ static int rt2800_probe_hw_mode(struct r
|
||||
switch (rx_chains) {
|
||||
case 3:
|
||||
spec->ht.mcs.rx_mask[2] = 0xff;
|
||||
+ /* fall through */
|
||||
case 2:
|
||||
spec->ht.mcs.rx_mask[1] = 0xff;
|
||||
+ /* fall through */
|
||||
case 1:
|
||||
spec->ht.mcs.rx_mask[0] = 0xff;
|
||||
spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
|
@ -0,0 +1,25 @@
|
||||
From 641dd8068ecb078e7d12efe465df202bc16ca5eb Mon Sep 17 00:00:00 2001
|
||||
From: "Gustavo A. R. Silva" <gustavo@embeddedor.com>
|
||||
Date: Mon, 22 Oct 2018 22:46:47 +0200
|
||||
Subject: [PATCH 10/28] rt2x00: rt61pci: mark expected switch fall-through
|
||||
|
||||
In preparation to enabling -Wimplicit-fallthrough, mark switch cases
|
||||
where we are expecting to fall through.
|
||||
|
||||
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt61pci.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
|
||||
@@ -2226,7 +2226,7 @@ static void rt61pci_txdone(struct rt2x00
|
||||
break;
|
||||
case 6: /* Failure, excessive retries */
|
||||
__set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags);
|
||||
- /* Don't break, this is a failed frame! */
|
||||
+ /* Fall through - this is a failed frame! */
|
||||
default: /* Failure */
|
||||
__set_bit(TXDONE_FAILURE, &txdesc.flags);
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
From 750afb08ca71310fcf0c4e2cb1565c63b8235b60 Mon Sep 17 00:00:00 2001
|
||||
From: Luis Chamberlain <mcgrof@kernel.org>
|
||||
Date: Fri, 4 Jan 2019 09:23:09 +0100
|
||||
Subject: [PATCH 11/28] cross-tree: phase out dma_zalloc_coherent()
|
||||
|
||||
We already need to zero out memory for dma_alloc_coherent(), as such
|
||||
using dma_zalloc_coherent() is superflous. Phase it out.
|
||||
|
||||
This change was generated with the following Coccinelle SmPL patch:
|
||||
|
||||
@ replace_dma_zalloc_coherent @
|
||||
expression dev, size, data, handle, flags;
|
||||
@@
|
||||
|
||||
-dma_zalloc_coherent(dev, size, handle, flags)
|
||||
+dma_alloc_coherent(dev, size, handle, flags)
|
||||
|
||||
Suggested-by: Christoph Hellwig <hch@lst.de>
|
||||
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
|
||||
[hch: re-ran the script on the latest tree]
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c
|
||||
@@ -119,9 +119,9 @@ static int rt2x00mmio_alloc_queue_dma(st
|
||||
/*
|
||||
* Allocate DMA memory for descriptor and buffer.
|
||||
*/
|
||||
- addr = dma_zalloc_coherent(rt2x00dev->dev,
|
||||
- queue->limit * queue->desc_size, &dma,
|
||||
- GFP_KERNEL);
|
||||
+ addr = dma_alloc_coherent(rt2x00dev->dev,
|
||||
+ queue->limit * queue->desc_size, &dma,
|
||||
+ GFP_KERNEL);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
@ -0,0 +1,32 @@
|
||||
From c2e28ef7711ffcb083474ee5f154264c6ec1ec07 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
|
||||
Date: Thu, 27 Dec 2018 15:05:25 +0100
|
||||
Subject: [PATCH 12/28] rt2x00: reduce tx power to nominal level on RT6352
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Current implementation of RT6352 support provides too high tx power
|
||||
at least on iPA/eLNA devices. Reduce amplification of variable gain
|
||||
amplifier by 6dB to match board target power of 17dBm.
|
||||
Transmited signal strength with this patch is similar to that of
|
||||
stock firmware or pandorabox firmware. Throughput measured with iperf
|
||||
improves. Device tested: Xiaomi Miwifi Mini.
|
||||
|
||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -5477,7 +5477,7 @@ static int rt2800_init_registers(struct
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
|
||||
rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002);
|
||||
rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F);
|
||||
- rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606);
|
||||
+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
|
||||
rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
|
||||
rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0);
|
||||
rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C);
|
@ -0,0 +1,143 @@
|
||||
From a4296994eb8061ee3455721a296c387c639bf635 Mon Sep 17 00:00:00 2001
|
||||
From: Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||
Date: Tue, 15 Jan 2019 14:01:29 +0000
|
||||
Subject: [PATCH 13/28] rt2x00: Work around a firmware bug with shared keys
|
||||
|
||||
Apparently the rt2x61 firmware fails temporarily to decode
|
||||
broadcast packets if the shared keys are not assigned
|
||||
in the "correct" sequence. At the same time unicast
|
||||
packets work fine, since they are encrypted with the
|
||||
pairwise key.
|
||||
|
||||
At least with WPA2 CCMP mode the shared keys are
|
||||
set in the following sequence: keyidx=1, 2, 1, 2.
|
||||
After a while only keyidx 2 gets decrypted, and
|
||||
keyidx 1 is ignored, probably because there is never
|
||||
a keyidx 3.
|
||||
|
||||
Symptoms are arping -b works for 10 minutes, since
|
||||
keyidx=2 is used for broadcast, and then it stops
|
||||
working for 10 minutes, because keyidx=1 is used.
|
||||
That failure mode repeats forever.
|
||||
|
||||
Note, the firmware does not even know which keyidx
|
||||
corresponds to which hw_key_idx so the firmware is
|
||||
trying to be smarter than the driver, which is bound
|
||||
to fail.
|
||||
|
||||
As workaround the function rt61pci_config_shared_key
|
||||
requests software decryption of the shared keys,
|
||||
by returning EOPNOTSUPP. However, pairwise keys are
|
||||
still handled by hardware which works just fine.
|
||||
|
||||
Signed-off-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||
Acked-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt61pci.c | 93 +-------------------
|
||||
1 file changed, 4 insertions(+), 89 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
|
||||
@@ -321,97 +321,12 @@ static int rt61pci_config_shared_key(str
|
||||
struct rt2x00lib_crypto *crypto,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
- struct hw_key_entry key_entry;
|
||||
- struct rt2x00_field32 field;
|
||||
- u32 mask;
|
||||
- u32 reg;
|
||||
-
|
||||
- if (crypto->cmd == SET_KEY) {
|
||||
- /*
|
||||
- * rt2x00lib can't determine the correct free
|
||||
- * key_idx for shared keys. We have 1 register
|
||||
- * with key valid bits. The goal is simple, read
|
||||
- * the register, if that is full we have no slots
|
||||
- * left.
|
||||
- * Note that each BSS is allowed to have up to 4
|
||||
- * shared keys, so put a mask over the allowed
|
||||
- * entries.
|
||||
- */
|
||||
- mask = (0xf << crypto->bssidx);
|
||||
-
|
||||
- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR0);
|
||||
- reg &= mask;
|
||||
-
|
||||
- if (reg && reg == mask)
|
||||
- return -ENOSPC;
|
||||
-
|
||||
- key->hw_key_idx += reg ? ffz(reg) : 0;
|
||||
-
|
||||
- /*
|
||||
- * Upload key to hardware
|
||||
- */
|
||||
- memcpy(key_entry.key, crypto->key,
|
||||
- sizeof(key_entry.key));
|
||||
- memcpy(key_entry.tx_mic, crypto->tx_mic,
|
||||
- sizeof(key_entry.tx_mic));
|
||||
- memcpy(key_entry.rx_mic, crypto->rx_mic,
|
||||
- sizeof(key_entry.rx_mic));
|
||||
-
|
||||
- reg = SHARED_KEY_ENTRY(key->hw_key_idx);
|
||||
- rt2x00mmio_register_multiwrite(rt2x00dev, reg,
|
||||
- &key_entry, sizeof(key_entry));
|
||||
-
|
||||
- /*
|
||||
- * The cipher types are stored over 2 registers.
|
||||
- * bssidx 0 and 1 keys are stored in SEC_CSR1 and
|
||||
- * bssidx 1 and 2 keys are stored in SEC_CSR5.
|
||||
- * Using the correct defines correctly will cause overhead,
|
||||
- * so just calculate the correct offset.
|
||||
- */
|
||||
- if (key->hw_key_idx < 8) {
|
||||
- field.bit_offset = (3 * key->hw_key_idx);
|
||||
- field.bit_mask = 0x7 << field.bit_offset;
|
||||
-
|
||||
- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR1);
|
||||
- rt2x00_set_field32(®, field, crypto->cipher);
|
||||
- rt2x00mmio_register_write(rt2x00dev, SEC_CSR1, reg);
|
||||
- } else {
|
||||
- field.bit_offset = (3 * (key->hw_key_idx - 8));
|
||||
- field.bit_mask = 0x7 << field.bit_offset;
|
||||
-
|
||||
- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR5);
|
||||
- rt2x00_set_field32(®, field, crypto->cipher);
|
||||
- rt2x00mmio_register_write(rt2x00dev, SEC_CSR5, reg);
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * The driver does not support the IV/EIV generation
|
||||
- * in hardware. However it doesn't support the IV/EIV
|
||||
- * inside the ieee80211 frame either, but requires it
|
||||
- * to be provided separately for the descriptor.
|
||||
- * rt2x00lib will cut the IV/EIV data out of all frames
|
||||
- * given to us by mac80211, but we must tell mac80211
|
||||
- * to generate the IV/EIV data.
|
||||
- */
|
||||
- key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
- }
|
||||
-
|
||||
/*
|
||||
- * SEC_CSR0 contains only single-bit fields to indicate
|
||||
- * a particular key is valid. Because using the FIELD32()
|
||||
- * defines directly will cause a lot of overhead, we use
|
||||
- * a calculation to determine the correct bit directly.
|
||||
+ * Let the software handle the shared keys,
|
||||
+ * since the hardware decryption does not work reliably,
|
||||
+ * because the firmware does not know the key's keyidx.
|
||||
*/
|
||||
- mask = 1 << key->hw_key_idx;
|
||||
-
|
||||
- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR0);
|
||||
- if (crypto->cmd == SET_KEY)
|
||||
- reg |= mask;
|
||||
- else if (crypto->cmd == DISABLE_KEY)
|
||||
- reg &= ~mask;
|
||||
- rt2x00mmio_register_write(rt2x00dev, SEC_CSR0, reg);
|
||||
-
|
||||
- return 0;
|
||||
+ return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int rt61pci_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
|
@ -0,0 +1,107 @@
|
||||
From 2587791d57588562c21e5ef7e678f02ab2f3eb82 Mon Sep 17 00:00:00 2001
|
||||
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Date: Tue, 22 Jan 2019 16:21:34 +0100
|
||||
Subject: [PATCH 14/28] rt2x00: no need to check return value of debugfs_create
|
||||
functions
|
||||
|
||||
When calling debugfs functions, there is no need to ever check the
|
||||
return value. The function can work or not, but the code logic should
|
||||
never do something different based on this.
|
||||
|
||||
Cc: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Cc: Helmut Schaa <helmut.schaa@googlemail.com>
|
||||
Cc: Kalle Valo <kvalo@codeaurora.org>
|
||||
Cc: linux-wireless@vger.kernel.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Acked-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2x00debug.c | 27 -------------------
|
||||
1 file changed, 27 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c
|
||||
@@ -656,36 +656,24 @@ void rt2x00debug_register(struct rt2x00_
|
||||
intf->driver_folder =
|
||||
debugfs_create_dir(intf->rt2x00dev->ops->name,
|
||||
rt2x00dev->hw->wiphy->debugfsdir);
|
||||
- if (IS_ERR(intf->driver_folder) || !intf->driver_folder)
|
||||
- goto exit;
|
||||
|
||||
intf->driver_entry =
|
||||
rt2x00debug_create_file_driver("driver", intf, &intf->driver_blob);
|
||||
- if (IS_ERR(intf->driver_entry) || !intf->driver_entry)
|
||||
- goto exit;
|
||||
|
||||
intf->chipset_entry =
|
||||
rt2x00debug_create_file_chipset("chipset",
|
||||
intf, &intf->chipset_blob);
|
||||
- if (IS_ERR(intf->chipset_entry) || !intf->chipset_entry)
|
||||
- goto exit;
|
||||
|
||||
intf->dev_flags = debugfs_create_file("dev_flags", 0400,
|
||||
intf->driver_folder, intf,
|
||||
&rt2x00debug_fop_dev_flags);
|
||||
- if (IS_ERR(intf->dev_flags) || !intf->dev_flags)
|
||||
- goto exit;
|
||||
|
||||
intf->cap_flags = debugfs_create_file("cap_flags", 0400,
|
||||
intf->driver_folder, intf,
|
||||
&rt2x00debug_fop_cap_flags);
|
||||
- if (IS_ERR(intf->cap_flags) || !intf->cap_flags)
|
||||
- goto exit;
|
||||
|
||||
intf->register_folder =
|
||||
debugfs_create_dir("register", intf->driver_folder);
|
||||
- if (IS_ERR(intf->register_folder) || !intf->register_folder)
|
||||
- goto exit;
|
||||
|
||||
#define RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(__intf, __name) \
|
||||
({ \
|
||||
@@ -695,9 +683,6 @@ void rt2x00debug_register(struct rt2x00_
|
||||
0600, \
|
||||
(__intf)->register_folder, \
|
||||
&(__intf)->offset_##__name); \
|
||||
- if (IS_ERR((__intf)->__name##_off_entry) || \
|
||||
- !(__intf)->__name##_off_entry) \
|
||||
- goto exit; \
|
||||
\
|
||||
(__intf)->__name##_val_entry = \
|
||||
debugfs_create_file(__stringify(__name) "_value", \
|
||||
@@ -705,9 +690,6 @@ void rt2x00debug_register(struct rt2x00_
|
||||
(__intf)->register_folder, \
|
||||
(__intf), \
|
||||
&rt2x00debug_fop_##__name); \
|
||||
- if (IS_ERR((__intf)->__name##_val_entry) || \
|
||||
- !(__intf)->__name##_val_entry) \
|
||||
- goto exit; \
|
||||
} \
|
||||
})
|
||||
|
||||
@@ -721,15 +703,10 @@ void rt2x00debug_register(struct rt2x00_
|
||||
|
||||
intf->queue_folder =
|
||||
debugfs_create_dir("queue", intf->driver_folder);
|
||||
- if (IS_ERR(intf->queue_folder) || !intf->queue_folder)
|
||||
- goto exit;
|
||||
|
||||
intf->queue_frame_dump_entry =
|
||||
debugfs_create_file("dump", 0400, intf->queue_folder,
|
||||
intf, &rt2x00debug_fop_queue_dump);
|
||||
- if (IS_ERR(intf->queue_frame_dump_entry)
|
||||
- || !intf->queue_frame_dump_entry)
|
||||
- goto exit;
|
||||
|
||||
skb_queue_head_init(&intf->frame_dump_skbqueue);
|
||||
init_waitqueue_head(&intf->frame_dump_waitqueue);
|
||||
@@ -747,10 +724,6 @@ void rt2x00debug_register(struct rt2x00_
|
||||
#endif
|
||||
|
||||
return;
|
||||
-
|
||||
-exit:
|
||||
- rt2x00debug_deregister(rt2x00dev);
|
||||
- rt2x00_err(rt2x00dev, "Failed to register debug handler\n");
|
||||
}
|
||||
|
||||
void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)
|
@ -0,0 +1,137 @@
|
||||
From 17ae2acd1a6f5148edd80d84194e5d7c80be360e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
|
||||
Date: Wed, 13 Feb 2019 11:09:12 +0100
|
||||
Subject: [PATCH 15/28] rt2x00: remove unneeded check
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Remove band check from rf53xx channel config routine since all chips
|
||||
using it are single band.
|
||||
|
||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 103 +++++++++---------
|
||||
1 file changed, 50 insertions(+), 53 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -2966,6 +2966,7 @@ static void rt2800_config_channel_rf53xx
|
||||
struct channel_info *info)
|
||||
{
|
||||
u8 rfcsr;
|
||||
+ int idx = rf->channel-1;
|
||||
|
||||
rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
|
||||
rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
|
||||
@@ -3003,60 +3004,56 @@ static void rt2800_config_channel_rf53xx
|
||||
|
||||
rt2800_freq_cal_mode1(rt2x00dev);
|
||||
|
||||
- if (rf->channel <= 14) {
|
||||
- int idx = rf->channel-1;
|
||||
+ if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
|
||||
+ if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
|
||||
+ /* r55/r59 value array of channel 1~14 */
|
||||
+ static const char r55_bt_rev[] = {0x83, 0x83,
|
||||
+ 0x83, 0x73, 0x73, 0x63, 0x53, 0x53,
|
||||
+ 0x53, 0x43, 0x43, 0x43, 0x43, 0x43};
|
||||
+ static const char r59_bt_rev[] = {0x0e, 0x0e,
|
||||
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09,
|
||||
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
|
||||
+
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55,
|
||||
+ r55_bt_rev[idx]);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
+ r59_bt_rev[idx]);
|
||||
+ } else {
|
||||
+ static const char r59_bt[] = {0x8b, 0x8b, 0x8b,
|
||||
+ 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89,
|
||||
+ 0x88, 0x88, 0x86, 0x85, 0x84};
|
||||
|
||||
- if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
|
||||
- if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
|
||||
- /* r55/r59 value array of channel 1~14 */
|
||||
- static const char r55_bt_rev[] = {0x83, 0x83,
|
||||
- 0x83, 0x73, 0x73, 0x63, 0x53, 0x53,
|
||||
- 0x53, 0x43, 0x43, 0x43, 0x43, 0x43};
|
||||
- static const char r59_bt_rev[] = {0x0e, 0x0e,
|
||||
- 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09,
|
||||
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
|
||||
-
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55,
|
||||
- r55_bt_rev[idx]);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
- r59_bt_rev[idx]);
|
||||
- } else {
|
||||
- static const char r59_bt[] = {0x8b, 0x8b, 0x8b,
|
||||
- 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89,
|
||||
- 0x88, 0x88, 0x86, 0x85, 0x84};
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]);
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
|
||||
+ static const char r55_nonbt_rev[] = {0x23, 0x23,
|
||||
+ 0x23, 0x23, 0x13, 0x13, 0x03, 0x03,
|
||||
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
|
||||
+ static const char r59_nonbt_rev[] = {0x07, 0x07,
|
||||
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
+ 0x07, 0x07, 0x06, 0x05, 0x04, 0x04};
|
||||
+
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 55,
|
||||
+ r55_nonbt_rev[idx]);
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
+ r59_nonbt_rev[idx]);
|
||||
+ } else if (rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT5392) ||
|
||||
+ rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
+ static const char r59_non_bt[] = {0x8f, 0x8f,
|
||||
+ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
|
||||
+ 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
|
||||
+
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
+ r59_non_bt[idx]);
|
||||
+ } else if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
+ static const char r59_non_bt[] = {0x0b, 0x0b,
|
||||
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
|
||||
+ 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
|
||||
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]);
|
||||
- }
|
||||
- } else {
|
||||
- if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
|
||||
- static const char r55_nonbt_rev[] = {0x23, 0x23,
|
||||
- 0x23, 0x23, 0x13, 0x13, 0x03, 0x03,
|
||||
- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
|
||||
- static const char r59_nonbt_rev[] = {0x07, 0x07,
|
||||
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
|
||||
- 0x07, 0x07, 0x06, 0x05, 0x04, 0x04};
|
||||
-
|
||||
- rt2800_rfcsr_write(rt2x00dev, 55,
|
||||
- r55_nonbt_rev[idx]);
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
- r59_nonbt_rev[idx]);
|
||||
- } else if (rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
- rt2x00_rt(rt2x00dev, RT5392) ||
|
||||
- rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
- static const char r59_non_bt[] = {0x8f, 0x8f,
|
||||
- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
|
||||
- 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
|
||||
-
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
- r59_non_bt[idx]);
|
||||
- } else if (rt2x00_rt(rt2x00dev, RT5350)) {
|
||||
- static const char r59_non_bt[] = {0x0b, 0x0b,
|
||||
- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
|
||||
- 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
|
||||
-
|
||||
- rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
- r59_non_bt[idx]);
|
||||
- }
|
||||
+ rt2800_rfcsr_write(rt2x00dev, 59,
|
||||
+ r59_non_bt[idx]);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
From 5991a2ecd070ce5ef646b4e8e0bc8d99110604ed Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= <pozega.tomislav@gmail.com>
|
||||
Date: Wed, 13 Feb 2019 11:09:13 +0100
|
||||
Subject: [PATCH 16/28] rt2x00: remove confusing AGC register
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Register 66 was causing issues on RT6352 if set to the same value as
|
||||
in MTK driver. With 1c reg value device was working fine in both HT20
|
||||
and HT40 modes.
|
||||
|
||||
Signed-off-by: Tomislav Požega <pozega.tomislav@gmail.com>
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +-----
|
||||
1 file changed, 1 insertion(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3983,11 +3983,7 @@ static void rt2800_config_channel(struct
|
||||
rt2800_bbp_write(rt2x00dev, 196, reg);
|
||||
|
||||
/* AGC init */
|
||||
- if (rt2x00_rt(rt2x00dev, RT6352))
|
||||
- reg = 0x04;
|
||||
- else
|
||||
- reg = rf->channel <= 14 ? 0x1c : 0x24;
|
||||
-
|
||||
+ reg = rf->channel <= 14 ? 0x1c : 0x24;
|
||||
reg += 2 * rt2x00dev->lna_gain;
|
||||
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
|
||||
|
@ -0,0 +1,47 @@
|
||||
From 9ad3b55654455258a9463384edb40077439d879f Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Wed, 13 Feb 2019 11:09:14 +0100
|
||||
Subject: [PATCH 17/28] rt2800: enable TX_PIN_CFG_LNA_PE_ bits per band
|
||||
|
||||
Do not enable TX_PIN_CFG_LNA_PE_A* bits for 2.4GHz band and
|
||||
vice versa TX_PIN_CFG_LNA_PE_G* bits for 5GHz.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 ++++++++++++------
|
||||
1 file changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3893,18 +3893,24 @@ static void rt2800_config_channel(struct
|
||||
switch (rt2x00dev->default_ant.rx_chain_num) {
|
||||
case 3:
|
||||
/* Turn on tertiary LNAs */
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1);
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN,
|
||||
+ rf->channel > 14);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN,
|
||||
+ rf->channel <= 14);
|
||||
/* fall-through */
|
||||
case 2:
|
||||
/* Turn on secondary LNAs */
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN,
|
||||
+ rf->channel > 14);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN,
|
||||
+ rf->channel <= 14);
|
||||
/* fall-through */
|
||||
case 1:
|
||||
/* Turn on primary LNAs */
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN,
|
||||
+ rf->channel > 14);
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN,
|
||||
+ rf->channel <= 14);
|
||||
break;
|
||||
}
|
||||
|
@ -0,0 +1,41 @@
|
||||
From 7aca14885edeab536a8cbe1e7cfeadd4c3310b9b Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Wed, 13 Feb 2019 11:09:15 +0100
|
||||
Subject: [PATCH 18/28] rt2800: enable TX_PIN_CFG_RFRX_EN only for MT7620
|
||||
|
||||
The TX_PIN_CFG_RFRX_EN bit was not set on other devices than MT7620,
|
||||
restore old behavaviour since setting this bit maight not be
|
||||
correct for older devices.
|
||||
|
||||
Fixes: 41977e86c984 ("rt2x00: add support for MT7620")
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3858,10 +3858,12 @@ static void rt2800_config_channel(struct
|
||||
if (rt2x00_rt(rt2x00dev, RT3572))
|
||||
rt2800_rfcsr_write(rt2x00dev, 8, 0);
|
||||
|
||||
- if (rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
|
||||
- else
|
||||
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1);
|
||||
+ } else {
|
||||
tx_pin = 0;
|
||||
+ }
|
||||
|
||||
switch (rt2x00dev->default_ant.tx_chain_num) {
|
||||
case 3:
|
||||
@@ -3916,7 +3918,6 @@ static void rt2800_config_channel(struct
|
||||
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
|
||||
rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
|
||||
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); /* mt7620 */
|
||||
|
||||
rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
|
||||
|
@ -0,0 +1,33 @@
|
||||
From c7ff1bfeaf1ca69e3e401be211b55d1738d0c5fc Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Wed, 13 Feb 2019 11:09:16 +0100
|
||||
Subject: [PATCH 19/28] rt2800: comment and simplify AGC init for RT6352
|
||||
|
||||
We do not need separate lines for calculating register values.
|
||||
Also add comment that value is different than in vendor driver.
|
||||
|
||||
Suggested-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3989,9 +3989,12 @@ static void rt2800_config_channel(struct
|
||||
rt2800_bbp_write(rt2x00dev, 195, 141);
|
||||
rt2800_bbp_write(rt2x00dev, 196, reg);
|
||||
|
||||
- /* AGC init */
|
||||
- reg = rf->channel <= 14 ? 0x1c : 0x24;
|
||||
- reg += 2 * rt2x00dev->lna_gain;
|
||||
+ /* AGC init.
|
||||
+ * Despite the vendor driver using different values here for
|
||||
+ * RT6352 chip, we use 0x1c for now. This may have to be changed
|
||||
+ * once TSSI got implemented.
|
||||
+ */
|
||||
+ reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain;
|
||||
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
|
||||
|
||||
rt2800_iq_calibrate(rt2x00dev, rf->channel);
|
@ -0,0 +1,33 @@
|
||||
From 1a8a8989b779e51e4652a30e9f22c36a1b6ffc4b Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Thu, 20 Dec 2018 16:16:11 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10739037
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 20/28] rt2x00: do not print error when queue is full
|
||||
|
||||
For unknown reasons printk() on some context can cause CPU hung on
|
||||
embedded MT7620 AP/router MIPS platforms. What can result on wifi
|
||||
disconnects.
|
||||
|
||||
This patch move queue full messages to debug level what is consistent
|
||||
with other mac80211 drivers which drop packet silently if tx queue is
|
||||
full. This make MT7620 OpenWRT routers more stable, what was reported
|
||||
by various users.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
|
||||
@@ -671,7 +671,7 @@ int rt2x00queue_write_tx_frame(struct da
|
||||
spin_lock(&queue->tx_lock);
|
||||
|
||||
if (unlikely(rt2x00queue_full(queue))) {
|
||||
- rt2x00_err(queue->rt2x00dev, "Dropping frame due to full tx queue %d\n",
|
||||
+ rt2x00_dbg(queue->rt2x00dev, "Dropping frame due to full tx queue %d\n",
|
||||
queue->qid);
|
||||
ret = -ENOBUFS;
|
||||
goto out;
|
@ -0,0 +1,128 @@
|
||||
From 91a5340db0526b7263bc8da14b120ea3129b5f28 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:31 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804437
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 21/28] rt2800: partially restore old mmio txstatus behaviour
|
||||
|
||||
Do not disable txstatus interrupt and add quota of processed tx statuses in
|
||||
one tasklet. Quota is needed to allow to fed device with new frames during
|
||||
processing of tx statuses.
|
||||
|
||||
Patch fixes about 15% performance degradation on some scenarios coused by
|
||||
0b0d556e0ebb ("rt2800mmio: use txdone/txstatus routines from lib").
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 4 +--
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.h | 2 +-
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 30 +++++--------------
|
||||
.../net/wireless/ralink/rt2x00/rt2800usb.c | 2 +-
|
||||
4 files changed, 12 insertions(+), 26 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1100,7 +1100,7 @@ void rt2800_txdone_entry(struct queue_en
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
|
||||
|
||||
-void rt2800_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
+void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
struct queue_entry *entry;
|
||||
@@ -1108,7 +1108,7 @@ void rt2800_txdone(struct rt2x00_dev *rt
|
||||
u8 qid;
|
||||
bool match;
|
||||
|
||||
- while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) {
|
||||
+ while (quota-- > 0 && kfifo_get(&rt2x00dev->txstatus_fifo, ®)) {
|
||||
/*
|
||||
* TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is
|
||||
* guaranteed to be one of the TX QIDs .
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
@@ -195,7 +195,7 @@ void rt2800_process_rxwi(struct queue_en
|
||||
|
||||
void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
|
||||
bool match);
|
||||
-void rt2800_txdone(struct rt2x00_dev *rt2x00dev);
|
||||
+void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota);
|
||||
void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev);
|
||||
bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
@@ -255,20 +255,6 @@ void rt2800mmio_autowake_tasklet(unsigne
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
|
||||
|
||||
-static void rt2800mmio_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
-{
|
||||
- bool timeout = false;
|
||||
-
|
||||
- while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) ||
|
||||
- (timeout = rt2800_txstatus_timeout(rt2x00dev))) {
|
||||
-
|
||||
- rt2800_txdone(rt2x00dev);
|
||||
-
|
||||
- if (timeout)
|
||||
- rt2800_txdone_nostatus(rt2x00dev);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 status;
|
||||
@@ -305,14 +291,11 @@ void rt2800mmio_txstatus_tasklet(unsigne
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
|
||||
|
||||
- do {
|
||||
- rt2800mmio_txdone(rt2x00dev);
|
||||
+ rt2800_txdone(rt2x00dev, 16);
|
||||
|
||||
- } while (rt2800mmio_fetch_txstatus(rt2x00dev));
|
||||
+ if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo))
|
||||
+ tasklet_schedule(&rt2x00dev->txstatus_tasklet);
|
||||
|
||||
- if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
- rt2800mmio_enable_interrupt(rt2x00dev,
|
||||
- INT_SOURCE_CSR_TX_FIFO_STATUS);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_txstatus_tasklet);
|
||||
|
||||
@@ -339,8 +322,10 @@ irqreturn_t rt2800mmio_interrupt(int irq
|
||||
mask = ~reg;
|
||||
|
||||
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
|
||||
+ rt2x00_set_field32(&mask, INT_MASK_CSR_TX_FIFO_STATUS, 1);
|
||||
rt2800mmio_fetch_txstatus(rt2x00dev);
|
||||
- tasklet_schedule(&rt2x00dev->txstatus_tasklet);
|
||||
+ if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo))
|
||||
+ tasklet_schedule(&rt2x00dev->txstatus_tasklet);
|
||||
}
|
||||
|
||||
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT))
|
||||
@@ -500,7 +485,8 @@ void rt2800mmio_flush_queue(struct data_
|
||||
*/
|
||||
if (tx_queue) {
|
||||
tasklet_disable(&rt2x00dev->txstatus_tasklet);
|
||||
- rt2800mmio_txdone(rt2x00dev);
|
||||
+ rt2800_txdone(rt2x00dev, UINT_MAX);
|
||||
+ rt2800_txdone_nostatus(rt2x00dev);
|
||||
tasklet_enable(&rt2x00dev->txstatus_tasklet);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
|
||||
@@ -480,7 +480,7 @@ static void rt2800usb_work_txdone(struct
|
||||
while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) ||
|
||||
rt2800_txstatus_timeout(rt2x00dev)) {
|
||||
|
||||
- rt2800_txdone(rt2x00dev);
|
||||
+ rt2800_txdone(rt2x00dev, UINT_MAX);
|
||||
|
||||
rt2800_txdone_nostatus(rt2x00dev);
|
||||
|
@ -0,0 +1,27 @@
|
||||
From 11f8ad1656035176bad9d89de7ea0e7fe6d82c32 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:32 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804439
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 22/28] rt2800: new flush implementation for SoC devices
|
||||
|
||||
Use new flush_queue() calback for SoC devices, what was already done for
|
||||
PCIe devices.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800soc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -203,7 +203,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.start_queue = rt2800mmio_start_queue,
|
||||
.kick_queue = rt2800mmio_kick_queue,
|
||||
.stop_queue = rt2800mmio_stop_queue,
|
||||
- .flush_queue = rt2x00mmio_flush_queue,
|
||||
+ .flush_queue = rt2800mmio_flush_queue,
|
||||
.write_tx_desc = rt2800mmio_write_tx_desc,
|
||||
.write_tx_data = rt2800_write_tx_data,
|
||||
.write_beacon = rt2800_write_beacon,
|
@ -0,0 +1,106 @@
|
||||
From 2bbea7645c3d095014a080db170941818650e141 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:33 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804441
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 23/28] rt2800: move txstatus pending routine
|
||||
|
||||
Move rt2800usb_txstatus_pending routine to rt2800lib. It will be reused
|
||||
by rt2800mmio code.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.c | 17 ++++++++++++++
|
||||
.../net/wireless/ralink/rt2x00/rt2800lib.h | 1 +
|
||||
.../net/wireless/ralink/rt2x00/rt2800usb.c | 22 +++----------------
|
||||
3 files changed, 21 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1183,6 +1183,23 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_txstatus_timeout);
|
||||
|
||||
+/*
|
||||
+ * test if there is an entry in any TX queue for which DMA is done
|
||||
+ * but the TX status has not been returned yet
|
||||
+ */
|
||||
+bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ struct data_queue *queue;
|
||||
+
|
||||
+ tx_queue_for_each(rt2x00dev, queue) {
|
||||
+ if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) !=
|
||||
+ rt2x00queue_get_entry(queue, Q_INDEX_DONE))
|
||||
+ return true;
|
||||
+ }
|
||||
+ return false;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rt2800_txstatus_pending);
|
||||
+
|
||||
void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
|
||||
@@ -198,6 +198,7 @@ void rt2800_txdone_entry(struct queue_en
|
||||
void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota);
|
||||
void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev);
|
||||
bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev);
|
||||
+bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev);
|
||||
|
||||
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc);
|
||||
void rt2800_clear_beacon(struct queue_entry *entry);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
|
||||
@@ -100,22 +100,6 @@ static void rt2800usb_stop_queue(struct
|
||||
}
|
||||
}
|
||||
|
||||
-/*
|
||||
- * test if there is an entry in any TX queue for which DMA is done
|
||||
- * but the TX status has not been returned yet
|
||||
- */
|
||||
-static bool rt2800usb_txstatus_pending(struct rt2x00_dev *rt2x00dev)
|
||||
-{
|
||||
- struct data_queue *queue;
|
||||
-
|
||||
- tx_queue_for_each(rt2x00dev, queue) {
|
||||
- if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) !=
|
||||
- rt2x00queue_get_entry(queue, Q_INDEX_DONE))
|
||||
- return true;
|
||||
- }
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
#define TXSTATUS_READ_INTERVAL 1000000
|
||||
|
||||
static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -145,7 +129,7 @@ static bool rt2800usb_tx_sta_fifo_read_c
|
||||
if (rt2800_txstatus_timeout(rt2x00dev))
|
||||
queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
|
||||
|
||||
- if (rt2800usb_txstatus_pending(rt2x00dev)) {
|
||||
+ if (rt2800_txstatus_pending(rt2x00dev)) {
|
||||
/* Read register after 1 ms */
|
||||
hrtimer_start(&rt2x00dev->txstatus_timer,
|
||||
TXSTATUS_READ_INTERVAL,
|
||||
@@ -160,7 +144,7 @@ stop_reading:
|
||||
* clear_bit someone could do rt2x00usb_interrupt_txdone, so recheck
|
||||
* here again if status reading is needed.
|
||||
*/
|
||||
- if (rt2800usb_txstatus_pending(rt2x00dev) &&
|
||||
+ if (rt2800_txstatus_pending(rt2x00dev) &&
|
||||
!test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags))
|
||||
return true;
|
||||
else
|
||||
@@ -489,7 +473,7 @@ static void rt2800usb_work_txdone(struct
|
||||
* if the medium is busy, thus the TX_STA_FIFO entry is
|
||||
* also delayed -> use a timer to retrieve it.
|
||||
*/
|
||||
- if (rt2800usb_txstatus_pending(rt2x00dev))
|
||||
+ if (rt2800_txstatus_pending(rt2x00dev))
|
||||
rt2800usb_async_read_tx_status(rt2x00dev);
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
From f6a9618198e190a2ba09ce3f0aa8e9ee1763bd38 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:34 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804443
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 24/28] rt2800mmio: fetch tx status changes
|
||||
|
||||
Prepare to use rt2800mmio_fetch_txstatus() in concurrent manner and drop
|
||||
return value since is not longer needed.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 17 +++++++++--------
|
||||
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
@@ -255,12 +255,12 @@ void rt2800mmio_autowake_tasklet(unsigne
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
|
||||
|
||||
-static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
|
||||
+static void rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 status;
|
||||
- bool more = false;
|
||||
+ unsigned long flags;
|
||||
|
||||
- /* FIXEME: rewrite this comment
|
||||
+ /*
|
||||
* The TX_FIFO_STATUS interrupt needs special care. We should
|
||||
* read TX_STA_FIFO but we should do it immediately as otherwise
|
||||
* the register can overflow and we would lose status reports.
|
||||
@@ -271,20 +271,21 @@ static bool rt2800mmio_fetch_txstatus(st
|
||||
* because we can schedule the tasklet multiple times (when the
|
||||
* interrupt fires again during tx status processing).
|
||||
*
|
||||
- * txstatus tasklet is called with INT_SOURCE_CSR_TX_FIFO_STATUS
|
||||
- * disabled so have only one producer and one consumer - we don't
|
||||
- * need to lock the kfifo.
|
||||
+ * We also read statuses from tx status timeout timer, use
|
||||
+ * lock to prevent concurent writes to fifo.
|
||||
*/
|
||||
+
|
||||
+ spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
|
||||
+
|
||||
while (!kfifo_is_full(&rt2x00dev->txstatus_fifo)) {
|
||||
status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO);
|
||||
if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
|
||||
break;
|
||||
|
||||
kfifo_put(&rt2x00dev->txstatus_fifo, status);
|
||||
- more = true;
|
||||
}
|
||||
|
||||
- return more;
|
||||
+ spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
|
||||
}
|
||||
|
||||
void rt2800mmio_txstatus_tasklet(unsigned long data)
|
@ -0,0 +1,194 @@
|
||||
From 175c2548332b45b144af673e70fdbb1a947d7aba Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:35 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804445
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 25/28] rt2800mmio: use timer and work for handling tx statuses
|
||||
timeouts
|
||||
|
||||
Sometimes we can get into situation when there are pending statuses,
|
||||
but we do not get INT_SOURCE_CSR_TX_FIFO_STATUS. Handle this situation
|
||||
by arming timeout timer and read statuses (it will fix case when
|
||||
we just do not have irq) and queue work to handle case we missed
|
||||
statues from hardware FIFO.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.c | 81 +++++++++++++++++--
|
||||
.../net/wireless/ralink/rt2x00/rt2800mmio.h | 1 +
|
||||
.../net/wireless/ralink/rt2x00/rt2800pci.c | 2 +-
|
||||
.../net/wireless/ralink/rt2x00/rt2800soc.c | 2 +-
|
||||
.../net/wireless/ralink/rt2x00/rt2x00dev.c | 4 +
|
||||
5 files changed, 82 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
@@ -426,6 +426,9 @@ void rt2800mmio_start_queue(struct data_
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_start_queue);
|
||||
|
||||
+/* 200 ms */
|
||||
+#define TXSTATUS_TIMEOUT 200000000
|
||||
+
|
||||
void rt2800mmio_kick_queue(struct data_queue *queue)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
|
||||
@@ -440,6 +443,8 @@ void rt2800mmio_kick_queue(struct data_q
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
|
||||
entry->entry_idx);
|
||||
+ hrtimer_start(&rt2x00dev->txstatus_timer,
|
||||
+ TXSTATUS_TIMEOUT, HRTIMER_MODE_REL);
|
||||
break;
|
||||
case QID_MGMT:
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
@@ -484,12 +489,8 @@ void rt2800mmio_flush_queue(struct data_
|
||||
* For TX queues schedule completion tasklet to catch
|
||||
* tx status timeouts, othewise just wait.
|
||||
*/
|
||||
- if (tx_queue) {
|
||||
- tasklet_disable(&rt2x00dev->txstatus_tasklet);
|
||||
- rt2800_txdone(rt2x00dev, UINT_MAX);
|
||||
- rt2800_txdone_nostatus(rt2x00dev);
|
||||
- tasklet_enable(&rt2x00dev->txstatus_tasklet);
|
||||
- }
|
||||
+ if (tx_queue)
|
||||
+ queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
|
||||
|
||||
/*
|
||||
* Wait for a little while to give the driver
|
||||
@@ -627,6 +628,10 @@ void rt2800mmio_clear_entry(struct queue
|
||||
word = rt2x00_desc_read(entry_priv->desc, 1);
|
||||
rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 1);
|
||||
rt2x00_desc_write(entry_priv->desc, 1, word);
|
||||
+
|
||||
+ /* If last entry stop txstatus timer */
|
||||
+ if (entry->queue->length == 1)
|
||||
+ hrtimer_cancel(&rt2x00dev->txstatus_timer);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_clear_entry);
|
||||
@@ -759,6 +764,70 @@ int rt2800mmio_enable_radio(struct rt2x0
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800mmio_enable_radio);
|
||||
|
||||
+static void rt2800mmio_work_txdone(struct work_struct *work)
|
||||
+{
|
||||
+ struct rt2x00_dev *rt2x00dev =
|
||||
+ container_of(work, struct rt2x00_dev, txdone_work);
|
||||
+
|
||||
+ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
+ return;
|
||||
+
|
||||
+ while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) ||
|
||||
+ rt2800_txstatus_timeout(rt2x00dev)) {
|
||||
+
|
||||
+ tasklet_disable(&rt2x00dev->txstatus_tasklet);
|
||||
+ rt2800_txdone(rt2x00dev, UINT_MAX);
|
||||
+ rt2800_txdone_nostatus(rt2x00dev);
|
||||
+ tasklet_enable(&rt2x00dev->txstatus_tasklet);
|
||||
+ }
|
||||
+
|
||||
+ if (rt2800_txstatus_pending(rt2x00dev))
|
||||
+ hrtimer_start(&rt2x00dev->txstatus_timer,
|
||||
+ TXSTATUS_TIMEOUT, HRTIMER_MODE_REL);
|
||||
+}
|
||||
+
|
||||
+static enum hrtimer_restart rt2800mmio_tx_sta_fifo_timeout(struct hrtimer *timer)
|
||||
+{
|
||||
+ struct rt2x00_dev *rt2x00dev =
|
||||
+ container_of(timer, struct rt2x00_dev, txstatus_timer);
|
||||
+
|
||||
+ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
|
||||
+ goto out;
|
||||
+
|
||||
+ if (!rt2800_txstatus_pending(rt2x00dev))
|
||||
+ goto out;
|
||||
+
|
||||
+ rt2800mmio_fetch_txstatus(rt2x00dev);
|
||||
+ if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo))
|
||||
+ tasklet_schedule(&rt2x00dev->txstatus_tasklet);
|
||||
+ else
|
||||
+ queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
|
||||
+out:
|
||||
+ return HRTIMER_NORESTART;
|
||||
+}
|
||||
+
|
||||
+int rt2800mmio_probe_hw(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ int retval;
|
||||
+
|
||||
+ retval = rt2800_probe_hw(rt2x00dev);
|
||||
+ if (retval)
|
||||
+ return retval;
|
||||
+
|
||||
+ /*
|
||||
+ * Set txstatus timer function.
|
||||
+ */
|
||||
+ rt2x00dev->txstatus_timer.function = rt2800mmio_tx_sta_fifo_timeout;
|
||||
+
|
||||
+ /*
|
||||
+ * Overwrite TX done handler
|
||||
+ */
|
||||
+ INIT_WORK(&rt2x00dev->txdone_work, rt2800mmio_work_txdone);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(rt2800mmio_probe_hw);
|
||||
+
|
||||
MODULE_AUTHOR(DRV_PROJECT);
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
MODULE_DESCRIPTION("rt2800 MMIO library");
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h
|
||||
@@ -153,6 +153,7 @@ void rt2800mmio_stop_queue(struct data_q
|
||||
void rt2800mmio_queue_init(struct data_queue *queue);
|
||||
|
||||
/* Initialization functions */
|
||||
+int rt2800mmio_probe_hw(struct rt2x00_dev *rt2x00dev);
|
||||
bool rt2800mmio_get_entry_state(struct queue_entry *entry);
|
||||
void rt2800mmio_clear_entry(struct queue_entry *entry);
|
||||
int rt2800mmio_init_queues(struct rt2x00_dev *rt2x00dev);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
|
||||
@@ -346,7 +346,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.tbtt_tasklet = rt2800mmio_tbtt_tasklet,
|
||||
.rxdone_tasklet = rt2800mmio_rxdone_tasklet,
|
||||
.autowake_tasklet = rt2800mmio_autowake_tasklet,
|
||||
- .probe_hw = rt2800_probe_hw,
|
||||
+ .probe_hw = rt2800mmio_probe_hw,
|
||||
.get_firmware_name = rt2800pci_get_firmware_name,
|
||||
.check_firmware = rt2800_check_firmware,
|
||||
.load_firmware = rt2800_load_firmware,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -185,7 +185,7 @@ static const struct rt2x00lib_ops rt2800
|
||||
.tbtt_tasklet = rt2800mmio_tbtt_tasklet,
|
||||
.rxdone_tasklet = rt2800mmio_rxdone_tasklet,
|
||||
.autowake_tasklet = rt2800mmio_autowake_tasklet,
|
||||
- .probe_hw = rt2800_probe_hw,
|
||||
+ .probe_hw = rt2800mmio_probe_hw,
|
||||
.get_firmware_name = rt2800soc_get_firmware_name,
|
||||
.check_firmware = rt2800soc_check_firmware,
|
||||
.load_firmware = rt2800soc_load_firmware,
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -1391,6 +1391,8 @@ int rt2x00lib_probe_dev(struct rt2x00_de
|
||||
mutex_init(&rt2x00dev->conf_mutex);
|
||||
INIT_LIST_HEAD(&rt2x00dev->bar_list);
|
||||
spin_lock_init(&rt2x00dev->bar_list_lock);
|
||||
+ hrtimer_init(&rt2x00dev->txstatus_timer, CLOCK_MONOTONIC,
|
||||
+ HRTIMER_MODE_REL);
|
||||
|
||||
set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
|
||||
|
||||
@@ -1515,6 +1517,8 @@ void rt2x00lib_remove_dev(struct rt2x00_
|
||||
cancel_delayed_work_sync(&rt2x00dev->autowakeup_work);
|
||||
cancel_work_sync(&rt2x00dev->sleep_work);
|
||||
|
||||
+ hrtimer_cancel(&rt2x00dev->txstatus_timer);
|
||||
+
|
||||
/*
|
||||
* Kill the tx status tasklet.
|
||||
*/
|
@ -0,0 +1,57 @@
|
||||
From 6013a91f15c9dabd668d5736652b9bcfb0ef0378 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:36 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804447
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 26/28] rt2x00: remove last_nostatus_check
|
||||
|
||||
We do not any longer check txstatus timeout from tasklet, so do not need
|
||||
this optimization.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 ---------
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 --
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 1 -
|
||||
3 files changed, 12 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1164,15 +1164,6 @@ bool rt2800_txstatus_timeout(struct rt2x
|
||||
struct data_queue *queue;
|
||||
struct queue_entry *entry;
|
||||
|
||||
- if (!test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) {
|
||||
- unsigned long tout = msecs_to_jiffies(1000);
|
||||
-
|
||||
- if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout))
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- rt2x00dev->last_nostatus_check = jiffies;
|
||||
-
|
||||
tx_queue_for_each(rt2x00dev, queue) {
|
||||
entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
|
||||
if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -981,8 +981,6 @@ struct rt2x00_dev {
|
||||
*/
|
||||
DECLARE_KFIFO_PTR(txstatus_fifo, u32);
|
||||
|
||||
- unsigned long last_nostatus_check;
|
||||
-
|
||||
/*
|
||||
* Timer to ensure tx status reports are read (rt2800usb).
|
||||
*/
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
|
||||
@@ -1039,7 +1039,6 @@ void rt2x00queue_start_queues(struct rt2
|
||||
*/
|
||||
tx_queue_for_each(rt2x00dev, queue)
|
||||
rt2x00queue_start_queue(queue);
|
||||
- rt2x00dev->last_nostatus_check = jiffies;
|
||||
|
||||
rt2x00queue_start_queue(rt2x00dev->rx);
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
From 2758f09b22bc08e89e0391486b2d707ad2479599 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:37 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804449
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 27/28] rt2x00: remove not used entry field
|
||||
|
||||
Remove not used any longer queue_entry field and flag.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h
|
||||
@@ -361,7 +361,6 @@ enum queue_entry_flags {
|
||||
ENTRY_DATA_PENDING,
|
||||
ENTRY_DATA_IO_FAILED,
|
||||
ENTRY_DATA_STATUS_PENDING,
|
||||
- ENTRY_DATA_STATUS_SET,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -387,8 +386,6 @@ struct queue_entry {
|
||||
|
||||
unsigned int entry_idx;
|
||||
|
||||
- u32 status;
|
||||
-
|
||||
void *priv_data;
|
||||
};
|
||||
|
@ -0,0 +1,26 @@
|
||||
From f44e145869bb517460648e4ed71b7e9001964d06 Mon Sep 17 00:00:00 2001
|
||||
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
Date: Sat, 9 Feb 2019 12:08:38 +0100
|
||||
X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
X-Patchwork-Id: 10804451
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Subject: [PATCH 28/28] rt2x00mmio: remove legacy comment
|
||||
|
||||
Remove comment about fields that ware removed.
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h
|
||||
@@ -80,8 +80,6 @@ int rt2x00mmio_regbusy_read(struct rt2x0
|
||||
*
|
||||
* @desc: Pointer to device descriptor
|
||||
* @desc_dma: DMA pointer to &desc.
|
||||
- * @data: Pointer to device's entry memory.
|
||||
- * @data_dma: DMA pointer to &data.
|
||||
*/
|
||||
struct queue_entry_priv_mmio {
|
||||
__le32 *desc;
|
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -9409,6 +9409,7 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
@@ -9578,6 +9578,7 @@ static int rt2800_probe_rt(struct rt2x00
|
||||
case RT3390:
|
||||
case RT3572:
|
||||
case RT3593:
|
@ -31,7 +31,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
#define RF5362 0x5362
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8987,6 +8987,66 @@ static const struct rf_channel rf_vals_3
|
||||
@@ -9154,6 +9154,66 @@ static const struct rf_channel rf_vals_3
|
||||
{14, 0xF0, 2, 0x18},
|
||||
};
|
||||
|
||||
@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
static const struct rf_channel rf_vals_5592_xtal20[] = {
|
||||
/* Channel, N, K, mod, R */
|
||||
{1, 482, 4, 10, 3},
|
||||
@@ -9250,6 +9310,11 @@ static int rt2800_probe_hw_mode(struct r
|
||||
@@ -9417,6 +9477,11 @@ static int rt2800_probe_hw_mode(struct r
|
||||
spec->channels = rf_vals_3x;
|
||||
break;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user