if (!(cpuaddr = (void *)__get_free_pages(GFP_ATOMIC, get_order(size))))
return NULL;
+ memset(cpuaddr, 0x0, size);
+
/* physical addr. of the memory we just got */
phys_addr = __pa(cpuaddr);
*dma_handle = pcibr_dmatrans_addr(vhdl, NULL, phys_addr, size,
PCIIO_DMA_CMD | PCIIO_DMA_A64);
else {
- dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_CMD);
+ dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_CMD |
+ MINIMAL_ATE_FLAG(phys_addr, size));
if (dma_map) {
*dma_handle = (dma_addr_t)
pcibr_dmamap_addr(dma_map, phys_addr, size);
* let's use the PMU instead.
*/
dma_map = NULL;
- dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_DATA);
+ dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_DATA |
+ MINIMAL_ATE_FLAG(phys_addr, size));
if (!dma_map) {
printk(KERN_ERR "pci_map_single: Unable to allocate anymore "
typedef int pcibr_device_flags_t;
+#define MINIMAL_ATES_REQUIRED(addr, size) \
+ (IOPG(IOPGOFF(addr) + (size) - 1) == IOPG((size) - 1))
+
+#define MINIMAL_ATE_FLAG(addr, size) \
+ (MINIMAL_ATES_REQUIRED((u_long)addr, size) ? PCIBR_NO_ATE_ROUNDUP : 0)
+
/*
* Set bits in the Bridge Device(x) register for this device.
* "flags" are defined above. NOTE: this includes turning