diff options
author | Hamad Kadmany | 2017-03-08 12:52:10 +0100 |
---|---|---|
committer | Kalle Valo | 2017-03-09 09:04:00 +0100 |
commit | f2de576dcfd094b02297c251223b0e2c9de96c33 (patch) | |
tree | 3f08854046c7b6c6b3ecb4dfa00fe81df0a7cd1d /drivers/net/wireless/ath/wil6210/pmc.c | |
parent | wcn36xx: Fix error handling (diff) | |
download | kernel-qcow2-linux-f2de576dcfd094b02297c251223b0e2c9de96c33.tar.gz kernel-qcow2-linux-f2de576dcfd094b02297c251223b0e2c9de96c33.tar.xz kernel-qcow2-linux-f2de576dcfd094b02297c251223b0e2c9de96c33.zip |
wil6210: set dma mask to reflect device capability
device supports 48bit addresses, reflect that by
setting the dma mask accordingly.
Signed-off-by: Hamad Kadmany <qca_hkadmany@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/pmc.c')
-rw-r--r-- | drivers/net/wireless/ath/wil6210/pmc.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/wil6210/pmc.c b/drivers/net/wireless/ath/wil6210/pmc.c index 3ff4f4ce9fef..b067fdf086d4 100644 --- a/drivers/net/wireless/ath/wil6210/pmc.c +++ b/drivers/net/wireless/ath/wil6210/pmc.c @@ -107,13 +107,28 @@ void wil_pmc_alloc(struct wil6210_priv *wil, /* Allocate pring buffer and descriptors. * vring->va should be aligned on its size rounded up to power of 2 - * This is granted by the dma_alloc_coherent + * This is granted by the dma_alloc_coherent. + * + * HW has limitation that all vrings addresses must share the same + * upper 16 msb bits part of 48 bits address. To workaround that, + * if we are using 48 bit addresses switch to 32 bit allocation + * before allocating vring memory. + * + * There's no check for the return value of dma_set_mask_and_coherent, + * since we assume if we were able to set the mask during + * initialization in this system it will not fail if we set it again */ + if (wil->use_extended_dma_addr) + dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); + pmc->pring_va = dma_alloc_coherent(dev, sizeof(struct vring_tx_desc) * num_descriptors, &pmc->pring_pa, GFP_KERNEL); + if (wil->use_extended_dma_addr) + dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48)); + wil_dbg_misc(wil, "pmc_alloc: allocated pring %p => %pad. %zd x %d = total %zd bytes\n", pmc->pring_va, &pmc->pring_pa, |