]> git.hungrycats.org Git - linux/commitdiff
ALSA: ctxfi: Fallback DMA mask to 32bit
authorTakashi Iwai <tiwai@suse.de>
Tue, 28 Feb 2017 16:16:48 +0000 (17:16 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 7 Jun 2017 22:47:06 +0000 (00:47 +0200)
commit 15c75b09f8d190f89ab4db463b87d411ca349dfe upstream.

Currently ctxfi driver tries to set only the 64bit DMA mask on 64bit
architectures, and bails out if it fails.  This causes a problem on
some platforms since the 64bit DMA isn't always guaranteed.  We should
fall back to the default 32bit DMA when 64bit DMA fails.

Fixes: 6d74b86d3c0f ("ALSA: ctxfi - Allow 64bit DMA")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Willy Tarreau <w@1wt.eu>
sound/pci/ctxfi/cthw20k1.c
sound/pci/ctxfi/cthw20k2.c

index 6ac40beb49dabea2b54e3de48a9eb721cfc3a5ae..abd0a2d0856c54db73473fc52cbec6efd2ab2c8a 100644 (file)
 #include "cthw20k1.h"
 #include "ct20k1reg.h"
 
-#if BITS_PER_LONG == 32
-#define CT_XFI_DMA_MASK                DMA_BIT_MASK(32) /* 32 bit PTE */
-#else
-#define CT_XFI_DMA_MASK                DMA_BIT_MASK(64) /* 64 bit PTE */
-#endif
-
 struct hw20k1 {
        struct hw hw;
        spinlock_t reg_20k1_lock;
@@ -1903,19 +1897,18 @@ static int hw_card_start(struct hw *hw)
 {
        int err;
        struct pci_dev *pci = hw->pci;
+       const unsigned int dma_bits = BITS_PER_LONG;
 
        err = pci_enable_device(pci);
        if (err < 0)
                return err;
 
        /* Set DMA transfer mask */
-       if (pci_set_dma_mask(pci, CT_XFI_DMA_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, CT_XFI_DMA_MASK) < 0) {
-               printk(KERN_ERR "architecture does not support PCI "
-                               "busmaster DMA with mask 0x%llx\n",
-                      CT_XFI_DMA_MASK);
-               err = -ENXIO;
-               goto error1;
+       if (dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
+               dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
+       } else {
+               dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
+               dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
        }
 
        if (!hw->io_base) {
index b1438861d38ade68112572dbec342240a24d9e34..5828a3ec58bbfd21824e951b050bfccfd4b2395c 100644 (file)
 #include "cthw20k2.h"
 #include "ct20k2reg.h"
 
-#if BITS_PER_LONG == 32
-#define CT_XFI_DMA_MASK                DMA_BIT_MASK(32) /* 32 bit PTE */
-#else
-#define CT_XFI_DMA_MASK                DMA_BIT_MASK(64) /* 64 bit PTE */
-#endif
-
 struct hw20k2 {
        struct hw hw;
        /* for i2c */
@@ -2026,18 +2020,18 @@ static int hw_card_start(struct hw *hw)
        int err = 0;
        struct pci_dev *pci = hw->pci;
        unsigned int gctl;
+       const unsigned int dma_bits = BITS_PER_LONG;
 
        err = pci_enable_device(pci);
        if (err < 0)
                return err;
 
        /* Set DMA transfer mask */
-       if (pci_set_dma_mask(pci, CT_XFI_DMA_MASK) < 0 ||
-           pci_set_consistent_dma_mask(pci, CT_XFI_DMA_MASK) < 0) {
-               printk(KERN_ERR "ctxfi: architecture does not support PCI "
-               "busmaster DMA with mask 0x%llx\n", CT_XFI_DMA_MASK);
-               err = -ENXIO;
-               goto error1;
+       if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
+               dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
+       } else {
+               dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
+               dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
        }
 
        if (!hw->io_base) {