]> www.infradead.org Git - users/dwmw2/openwrt.git/blob
6765c23083405bbe7f565c6438aa95901ad1a678
[users/dwmw2/openwrt.git] /
1 From 1dbf647f31751a4e94fa0435c34f0f5ad5ce0adc Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Fri, 26 May 2017 13:02:55 +0200
4 Subject: [PATCH] brcmfmac: fix alignment configuration on host using 64-bit
5  DMA
6
7 For SDIO the alignment requirement for transfers from device to host
8 is configured in firmware. This configuration is limited to minimum
9 of 4-byte alignment. However, this is not correct for platforms using
10 64-bit DMA when the minimum alignment should be 8 bytes. This issue
11 appeared when the ALIGNMENT definition was set according the DMA
12 configuration. The configuration in firmware was not using that macro
13 defintion, but a hardcoded value of 4. Hence the driver reported
14 alignment failures for data coming from the device and causing
15 transfers to fail.
16
17 Fixes: 6e84ab604bde ("brcmfmac: properly align buffers on certain platforms
18 Reported-by: Hans de Goede <hdegoede@redhat.com>
19 Tested-by: Hans de Goede <hdegoede@redhat.com>
20 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
21 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
22 Reviewed-by: Franky Lin <franky.lin@broadcom.com>
23 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
24 Signed-off-by: Hans de Goede <hdegoede@redhat.com>
25 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
26 ---
27  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +-
28  1 file changed, 1 insertion(+), 1 deletion(-)
29
30 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
31 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
32 @@ -3420,7 +3420,7 @@ static int brcmf_sdio_bus_preinit(struct
33                 /* otherwise, set txglomalign */
34                 value = sdiodev->settings->bus.sdio.sd_sgentry_align;
35                 /* SDIO ADMA requires at least 32 bit alignment */
36 -               value = max_t(u32, value, 4);
37 +               value = max_t(u32, value, ALIGNMENT);
38                 err = brcmf_iovar_data_set(dev, "bus:txglomalign", &value,
39                                            sizeof(u32));
40         }