mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-31 00:24:12 +00:00
mac80211: brcmfmac: backport remaining patches from the Linux 5.0
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
248797834b
commit
0994e65c6a
@ -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
|
||||
@@ -6631,6 +6631,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,227 @@
|
||||
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--;
|
||||
+ 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--;
|
||||
|
||||
- brcmf_dbg(DATA, "%s flags %d htod %X seq %X\n", entry->name, flags,
|
||||
- skcb->htod, seq);
|
||||
+ 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);
|
||||
+ /* 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);
|
||||
- return -EINVAL;
|
||||
+ 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)
|
@ -1,7 +1,7 @@
|
||||
From 22d319f2665dd3458d59c934fa0c8cf1b1d7227f Mon Sep 17 00:00:00 2001
|
||||
From 8c892df41500469729e0d662816300196e4f463d 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
|
||||
Date: Tue, 4 Dec 2018 20:29:05 +0200
|
||||
Subject: [PATCH] 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
|
||||
@ -15,6 +15,7 @@ Fixes: 7f9a3e150ec7 ("nl80211: Update ERP info using NL80211_CMD_UPDATE_CONNECT_
|
||||
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>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 11 +++++++++--
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +-
|
@ -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)
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user