I am working on a driver that uses PCI DMA transfers from system memory to the PCI device. On the 2.4.18 kernel it worked OK, but now when it is recompiled for 2.4.20 it doesn't. Digging into things I have found that the function virt_to_phys() has been changed from : return PHYSADDR(address) to return (unsigned long)address - PAGE_OFFSET Where PAGE_OFFSET is 0x8000 0000, and where PHYSADDR would AND the address against 0x1FFF FFFF. As far as I can tell the problem comes from pci_alloc_consistent doing : ret = UNCAC_ADDR(ret) which converts a 0x8xxx address to 0xAxxx, and then when you pass this 0xAxxx_xxxx address through virt_to_phys() you get an address of the form 0x2xxx_xxxx. This 0x2xxx_xxxx is passed to the dma controller as the physical address to where it must read / write data, and because it is 0x2xxx_xxxx and not 0x0xxx_xxxx an exception occurs. At first I just tried AND'ing out the 0xA.. like PHYSADDR used to do it, but with that change i no longer get the exception, but the driver does not dma the data across - it just sits there. I read DMA-mapping.txt and it says virt_to_phys() will be phased out, and should be used, but doesn't elaborate any further (like how you should do it now ). So after that long intro, my question is : Anybody know where I'm going wrong and how to fix things ? Also any tips on what drivers to look at for good examples would also be appreciated. TIA __________________________________ Do you Yahoo!? The New Yahoo! Search - Faster. Easier. Bingo. http://search.yahoo.com