brcmfmac: update 43012 F2 watermark setting to fix DMA Error during UDP RX Traffic
authorNaveen Gupta <naveen.gupta@cypress.com>
Wed, 21 Nov 2018 07:53:49 +0000 (07:53 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 13 Dec 2018 14:57:22 +0000 (16:57 +0200)
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>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c

index 73a034172c4c252104fe1474ac7c648a720c40fe..fe0cb398ab44ccd13389d9ddefa1686c0513df1f 100644 (file)
@@ -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(struct device *dev, int err,
                                           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);