x86/PCI: fix broken ISA DMA

Rene Herman reported:

> commit 8779f2fc3b84ebb6c5181fb13d702e9944c16069
>
> "x86: don't try to allocate from DMA zone at first"
>
> breaks all of ISA DMA. Or all of ALSA ISA DMA at least. All
> ISA soundcards are silent following that commit -- no error
> messages, everything appears fine, just silence.

That patch is buggy. We had an implicit assumption that
dev = NULL for ISA devices that require 24bit DMA.

The recent work on x86 dma_alloc_coherent() breaks the ISA DMA buffer
allocation, which is represented by "dev = NULL" and requires 24bit
DMA implicitly.

Bisected-by: Rene Herman <rene.herman@keyaccess.nl>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>

authored by Takashi Iwai and committed by Jesse Barnes 4a367f3a 21e2b0a5

+5 -3
+5 -3
arch/x86/kernel/pci-dma.c
··· 385 if (dma_alloc_from_coherent_mem(dev, size, dma_handle, &memory)) 386 return memory; 387 388 - if (!dev) 389 dev = &fallback_dev; 390 dma_mask = dev->coherent_dma_mask; 391 if (dma_mask == 0) 392 - dma_mask = DMA_32BIT_MASK; 393 394 /* Device not DMA able */ 395 if (dev->dma_mask == NULL) ··· 405 larger than 16MB and in this case we have a chance of 406 finding fitting memory in the next higher zone first. If 407 not retry with true GFP_DMA. -AK */ 408 - if (dma_mask <= DMA_32BIT_MASK) 409 gfp |= GFP_DMA32; 410 #endif 411
··· 385 if (dma_alloc_from_coherent_mem(dev, size, dma_handle, &memory)) 386 return memory; 387 388 + if (!dev) { 389 dev = &fallback_dev; 390 + gfp |= GFP_DMA; 391 + } 392 dma_mask = dev->coherent_dma_mask; 393 if (dma_mask == 0) 394 + dma_mask = (gfp & GFP_DMA) ? DMA_24BIT_MASK : DMA_32BIT_MASK; 395 396 /* Device not DMA able */ 397 if (dev->dma_mask == NULL) ··· 403 larger than 16MB and in this case we have a chance of 404 finding fitting memory in the next higher zone first. If 405 not retry with true GFP_DMA. -AK */ 406 + if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA)) 407 gfp |= GFP_DMA32; 408 #endif 409