1d4454e7ce
The current PowerPC code makes pci_unmap_addr(), pci_unmap_addr_set(), and friends trivial for all 32-bit kernels. This is reasonable, since for those kernels it is true that pci_unmap_single() does not need the DMA address from the original DMA mapping -- in fact, it is a NOP. However, I recently tried the tg3 driver on a PowerPC 440SPe machine, which runs a 32-bit kernel and has non-cache-coherent PCI DMA. I found that the tg3 driver crashed in pci_dma_sync_single_for_cpu(), since for non-coherent systems, that function must invalidate the cache for the DMA address range requested, and therefore it does use the address passed in. tg3 uses a DMA address it stashes away with pci_unmap_addr_set() and retrieves with pci_unmap_addr(). Of course, since pci_unmap_addr() is defined to (0) right now, this doesn't work. It seems to me that the tg3 driver is using pci_unmap_addr() in a legitimate way -- I wouldn't want to have to teach all drivers that they should use pci_unmap_addr() if they only need the address for unmapping functions, but if they want the pci_dma_sync functions, then they have to store the DMA address without the helper macros. The right fix therefore seems to be in the definition of the macros in <asm/pci.h> -- we should use the trivial versions only for 32-bit kernels for coherent systems, and the real versions for both 64-bit kernels and non-coherent systems. Signed-off-by: Roland Dreier <rolandd@cisco.com> Signed-off-by: Paul Mackerras <paulus@samba.org> |
||
---|---|---|
.. | ||
8xx_immap.h | ||
amigahw.h | ||
amigaints.h | ||
amigappc.h | ||
amigayle.h | ||
amipcmcia.h | ||
ans-lcd.h | ||
bootinfo.h | ||
bootx.h | ||
btext.h | ||
commproc.h | ||
cpm2.h | ||
delay.h | ||
device.h | ||
floppy.h | ||
fs_pd.h | ||
gg2.h | ||
gt64260_defs.h | ||
gt64260.h | ||
harrier.h | ||
hawk_defs.h | ||
hawk.h | ||
highmem.h | ||
hydra.h | ||
ibm4xx.h | ||
ibm44x.h | ||
ibm403.h | ||
ibm405.h | ||
ibm_ocp_pci.h | ||
ibm_ocp.h | ||
immap_85xx.h | ||
immap_cpm2.h | ||
io.h | ||
kgdb.h | ||
m48t35.h | ||
m8260_pci.h | ||
machdep.h | ||
md.h | ||
mk48t59.h | ||
mmu_context.h | ||
mmu.h | ||
mpc8xx.h | ||
mpc10x.h | ||
mpc52xx_psc.h | ||
mpc52xx.h | ||
mpc83xx.h | ||
mpc85xx.h | ||
mpc8260_pci9.h | ||
mpc8260.h | ||
mv64x60_defs.h | ||
mv64x60.h | ||
ocp_ids.h | ||
ocp.h | ||
open_pic.h | ||
page.h | ||
pc_serial.h | ||
pci-bridge.h | ||
pci.h | ||
pgalloc.h | ||
pgtable.h | ||
pnp.h | ||
ppc4xx_dma.h | ||
ppc4xx_pic.h | ||
ppc_sys.h | ||
ppcboot.h | ||
prep_nvram.h | ||
prom.h | ||
raven.h | ||
reg_booke.h | ||
residual.h | ||
rheap.h | ||
rio.h | ||
rtc.h | ||
serial.h | ||
smp.h | ||
spinlock.h | ||
suspend.h | ||
system.h | ||
time.h | ||
todc.h | ||
traps.h | ||
zorro.h |