| From ae0f063cd09d3c6876421cbf20164854a9957d6b Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Tue, 28 Feb 2017 17:16:48 +0100 |
| Subject: [PATCH] ALSA: ctxfi: Fallback DMA mask to 32bit |
| |
| 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") |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/pci/ctxfi/cthw20k1.c b/sound/pci/ctxfi/cthw20k1.c |
| index 9667cbfb0ca2..ab4cdab5cfa5 100644 |
| --- a/sound/pci/ctxfi/cthw20k1.c |
| +++ b/sound/pci/ctxfi/cthw20k1.c |
| @@ -27,12 +27,6 @@ |
| #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; |
| @@ -1904,19 +1898,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 (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 || |
| - dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) { |
| - dev_err(hw->card->dev, |
| - "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) { |
| diff --git a/sound/pci/ctxfi/cthw20k2.c b/sound/pci/ctxfi/cthw20k2.c |
| index 6414ecf93efa..18ee7768b7c4 100644 |
| --- a/sound/pci/ctxfi/cthw20k2.c |
| +++ b/sound/pci/ctxfi/cthw20k2.c |
| @@ -26,12 +26,6 @@ |
| #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 */ |
| @@ -2029,19 +2023,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 (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 || |
| - dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) { |
| - dev_err(hw->card->dev, |
| - "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) { |
| -- |
| 2.12.0 |
| |