Skip to content

Commit ba96212

Browse files
committed
cypress fmac patchset
v5.4.18-2021_0114 Signed-off-by: Robert Nelson <[email protected]>
1 parent d8c8b94 commit ba96212

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+4063
-482
lines changed

drivers/net/wireless/broadcom/brcm80211/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,14 @@ config BRCMDBG
3737
select WANT_DEV_COREDUMP if BRCMFMAC
3838
---help---
3939
Selecting this enables additional code for debug purposes.
40+
41+
config BRCMFMAC_PCIE_BARWIN_SZ
42+
bool "Custom PCIE BAR window size support for FullMAC driver"
43+
depends on BRCMFMAC
44+
depends on PCI
45+
default n
46+
---help---
47+
If you say Y here, the FMAC driver will use custom PCIE BAR
48+
window size. Say Y to allow developers to use custom PCIE
49+
BAR window size when HOST PCIE IP can support less then 4MB
50+
BAR window.

drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ struct brcmf_proto_bcdc_header {
8787
* plus any space that might be needed
8888
* for bus alignment padding.
8989
*/
90+
#define ROUND_UP_MARGIN 2048
91+
9092
struct brcmf_bcdc {
9193
u16 reqid;
9294
u8 bus_header[BUS_HEADER_LEN];
@@ -368,8 +370,7 @@ brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
368370

369371
/* await txstatus signal for firmware if active */
370372
if (brcmf_fws_fc_active(bcdc->fws)) {
371-
if (!success)
372-
brcmf_fws_bustxfail(bcdc->fws, txp);
373+
brcmf_fws_bustxcomplete(bcdc->fws, txp, success);
373374
} else {
374375
if (brcmf_proto_bcdc_hdrpull(bus_if->drvr, false, txp, &ifp))
375376
brcmu_pkt_buf_free_skb(txp);
@@ -471,7 +472,7 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
471472

472473
drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
473474
drvr->bus_if->maxctl = BRCMF_DCMD_MAXLEN +
474-
sizeof(struct brcmf_proto_bcdc_dcmd);
475+
sizeof(struct brcmf_proto_bcdc_dcmd) + ROUND_UP_MARGIN;
475476
return 0;
476477

477478
fail:

drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@
3636
#include "sdio.h"
3737
#include "core.h"
3838
#include "common.h"
39+
#include "cfg80211.h"
3940

4041
#define SDIOH_API_ACCESS_RETRY_LIMIT 2
4142

4243
#define DMA_ALIGN_MASK 0x03
4344

4445
#define SDIO_FUNC1_BLOCKSIZE 64
4546
#define SDIO_FUNC2_BLOCKSIZE 512
47+
#define SDIO_4373_FUNC2_BLOCKSIZE 256
48+
#define SDIO_435X_FUNC2_BLOCKSIZE 256
4649
/* Maximum milliseconds to wait for F2 to come up */
4750
#define SDIO_WAIT_F2RDY 3000
4851

@@ -865,7 +868,7 @@ static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
865868
}
866869
#endif /* CONFIG_PM_SLEEP */
867870

868-
static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
871+
int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
869872
{
870873
sdiodev->state = BRCMF_SDIOD_DOWN;
871874
if (sdiodev->bus) {
@@ -900,9 +903,10 @@ static void brcmf_sdiod_host_fixup(struct mmc_host *host)
900903
host->caps |= MMC_CAP_NONREMOVABLE;
901904
}
902905

903-
static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
906+
int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
904907
{
905908
int ret = 0;
909+
unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
906910

907911
sdio_claim_host(sdiodev->func1);
908912

@@ -912,11 +916,27 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
912916
sdio_release_host(sdiodev->func1);
913917
goto out;
914918
}
915-
ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
919+
920+
switch (sdiodev->func2->device) {
921+
case SDIO_DEVICE_ID_CYPRESS_4373:
922+
f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
923+
break;
924+
case SDIO_DEVICE_ID_BROADCOM_4359:
925+
case SDIO_DEVICE_ID_BROADCOM_4354:
926+
case SDIO_DEVICE_ID_BROADCOM_4356:
927+
f2_blksz = SDIO_435X_FUNC2_BLOCKSIZE;
928+
break;
929+
default:
930+
break;
931+
}
932+
933+
ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
916934
if (ret) {
917935
brcmf_err("Failed to set F2 blocksize\n");
918936
sdio_release_host(sdiodev->func1);
919937
goto out;
938+
} else {
939+
brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz);
920940
}
921941

922942
/* increase F2 timeout */
@@ -969,8 +989,10 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
969989
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
970990
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
971991
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
992+
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
972993
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
973994
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43012),
995+
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_89359),
974996
{ /* end: all zeroes */ }
975997
};
976998
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
@@ -1039,6 +1061,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
10391061
dev_set_drvdata(&func->dev, bus_if);
10401062
dev_set_drvdata(&sdiodev->func1->dev, bus_if);
10411063
sdiodev->dev = &sdiodev->func1->dev;
1064+
dev_set_drvdata(&sdiodev->func2->dev, bus_if);
10421065

10431066
brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
10441067

@@ -1055,6 +1078,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
10551078
fail:
10561079
dev_set_drvdata(&func->dev, NULL);
10571080
dev_set_drvdata(&sdiodev->func1->dev, NULL);
1081+
dev_set_drvdata(&sdiodev->func2->dev, NULL);
10581082
kfree(sdiodev);
10591083
kfree(bus_if);
10601084
return err;
@@ -1109,14 +1133,26 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
11091133
struct brcmf_bus *bus_if;
11101134
struct brcmf_sdio_dev *sdiodev;
11111135
mmc_pm_flag_t sdio_flags;
1136+
struct brcmf_cfg80211_info *config;
1137+
int retry = BRCMF_PM_WAIT_MAXRETRY;
11121138

11131139
func = container_of(dev, struct sdio_func, dev);
1140+
bus_if = dev_get_drvdata(dev);
1141+
config = bus_if->drvr->config;
1142+
11141143
brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
1144+
1145+
while (retry &&
1146+
config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
1147+
usleep_range(10000, 20000);
1148+
retry--;
1149+
}
1150+
if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
1151+
brcmf_err("timed out wait for cfg80211 suspended\n");
1152+
11151153
if (func->num != 1)
11161154
return 0;
11171155

1118-
1119-
bus_if = dev_get_drvdata(dev);
11201156
sdiodev = bus_if->bus_priv.sdio;
11211157

11221158
brcmf_sdiod_freezer_on(sdiodev);

drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
#define BRCMF_NROF_COMMON_MSGRINGS (BRCMF_NROF_H2D_COMMON_MSGRINGS + \
2323
BRCMF_NROF_D2H_COMMON_MSGRINGS)
2424

25+
/* The interval to poll console */
26+
#define BRCMF_CONSOLE 10
27+
28+
/* The maximum console interval value (5 mins) */
29+
#define MAX_CONSOLE_INTERVAL (5 * 60)
30+
2531
/* The level of bus communication with the dongle */
2632
enum brcmf_bus_state {
2733
BRCMF_BUS_DOWN, /* Not ready for frame transfers */
@@ -152,6 +158,9 @@ struct brcmf_bus {
152158

153159
const struct brcmf_bus_ops *ops;
154160
struct brcmf_bus_msgbuf *msgbuf;
161+
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
162+
bool allow_skborphan;
163+
#endif
155164
};
156165

157166
/*
@@ -255,7 +264,7 @@ void brcmf_rx_event(struct device *dev, struct sk_buff *rxp);
255264

256265
int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings);
257266
/* Indication from bus module regarding presence/insertion of dongle. */
258-
int brcmf_attach(struct device *dev);
267+
int brcmf_attach(struct device *dev, bool start_bus);
259268
/* Indication from bus module regarding removal/absence of dongle */
260269
void brcmf_detach(struct device *dev);
261270
void brcmf_free(struct device *dev);
@@ -271,6 +280,7 @@ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
271280

272281
s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len);
273282
void brcmf_bus_add_txhdrlen(struct device *dev, uint len);
283+
int brcmf_fwlog_attach(struct device *dev);
274284

275285
#ifdef CONFIG_BRCMFMAC_SDIO
276286
void brcmf_sdio_exit(void);

0 commit comments

Comments
 (0)