bdfe2ae85f73e3ac3a3577ed4110c2e0990b0499
[oweals/openwrt.git] /
1 From 172f6854551d48d1c9530f84513b421db944e714 Mon Sep 17 00:00:00 2001
2 From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
3 Date: Thu, 12 Dec 2019 00:52:46 +0100
4 Subject: [PATCH 2/7] brcmfmac: set F2 blocksize and watermark for 4359
5
6 Set F2 blocksize to 256 bytes and watermark to 0x40 for 4359. Also
7 enable and configure F1 MesBusyCtrl. It fixes DMA error while having
8 UDP bi-directional traffic.
9
10 Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
11 [slightly adapted for rebase on mainline linux]
12 Signed-off-by: Soeren Moch <smoch@web.de>
13 Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
14 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
15 ---
16  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |  6 +++++-
17  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 15 +++++++++++++++
18  2 files changed, 20 insertions(+), 1 deletion(-)
19
20 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
21 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
22 @@ -43,6 +43,7 @@
23  
24  #define SDIO_FUNC1_BLOCKSIZE           64
25  #define SDIO_FUNC2_BLOCKSIZE           512
26 +#define SDIO_4359_FUNC2_BLOCKSIZE      256
27  /* Maximum milliseconds to wait for F2 to come up */
28  #define SDIO_WAIT_F2RDY        3000
29  
30 @@ -903,6 +904,7 @@ static void brcmf_sdiod_host_fixup(struc
31  static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
32  {
33         int ret = 0;
34 +       unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
35  
36         sdio_claim_host(sdiodev->func1);
37  
38 @@ -912,7 +914,9 @@ static int brcmf_sdiod_probe(struct brcm
39                 sdio_release_host(sdiodev->func1);
40                 goto out;
41         }
42 -       ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
43 +       if (sdiodev->func2->device == SDIO_DEVICE_ID_BROADCOM_4359)
44 +               f2_blksz = SDIO_4359_FUNC2_BLOCKSIZE;
45 +       ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
46         if (ret) {
47                 brcmf_err("Failed to set F2 blocksize\n");
48                 sdio_release_host(sdiodev->func1);
49 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
50 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
51 @@ -42,6 +42,8 @@
52  #define DEFAULT_F2_WATERMARK    0x8
53  #define CY_4373_F2_WATERMARK    0x40
54  #define CY_43012_F2_WATERMARK    0x60
55 +#define CY_4359_F2_WATERMARK   0x40
56 +#define CY_4359_F1_MESBUSYCTRL (CY_4359_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
57  
58  #ifdef DEBUG
59  
60 @@ -4206,6 +4208,19 @@ static void brcmf_sdio_firmware_callback
61                         brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
62                                            &err);
63                         break;
64 +               case SDIO_DEVICE_ID_BROADCOM_4359:
65 +                       brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
66 +                                 CY_4359_F2_WATERMARK);
67 +                       brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
68 +                                          CY_4359_F2_WATERMARK, &err);
69 +                       devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
70 +                                                  &err);
71 +                       devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
72 +                       brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
73 +                                          &err);
74 +                       brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
75 +                                          CY_4359_F1_MESBUSYCTRL, &err);
76 +                       break;
77                 default:
78                         brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
79                                            DEFAULT_F2_WATERMARK, &err);