Maybe the wrong function is being used here, I'm not sure. I ran into
a problem with using virt_to_phys. The acacia driver for the IDT
rc32438 chip uses virt_to_phys to convert from a KSEG1 address to a
physical address. Somehow this works on their 2.4.18 kernel but does
not in the 2.4.22 tree. After changing virt_to_phys to this:
return (unsigned long)address - KSEGX(address);
everything worked just fine. I guess what I'm wondering is, is this
the correct way to get a physical address for use with DMA? The note
in io.h above the function says no but fails to tell me what should be
used. My guess is virt_to_bus is correct but they are identical
functions. Since I didn't write this driver, I can only assume that
address for the rung descriptors are accessed via KSEG1 so that they
are uncached and don't require flushing after each access. I had a
lot of dropped packets when I failed to access the ring descriptors
via KSEG1.
BAPper
|