In the 2.5 kernel pci_map_sg contains these lines: addr = (unsigned long) page_address(sg->page); if (addr) dma_cache_wback_inv(addr, sg->length); Surely when flushing the offset needs to be added to the page base address (addr)? So that this reads: if (addr) dma_cache_wback_inv(addr + sg->offset, sg->length); /Brian