I'm writting a PCI device driver that needs to allocate "large" aligned chunks of DMA memory for the hardware's queues. After loading and unloading the driver a number of times, bus_dmamem_alloc starts to fail.
In the device attach, the allocation code looks like (error checking removed for brevity) bus_dma_tag_create(NULL, 4, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE_32BIT, BUS_SPACE_MAXSIZE_32BIT, BUS_SPACE_UNRESTRICTED, 0, &parent); bus_dma_tag_create(parent, 65536, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 65536, 1, 65536, 0, &child); bus_dmamem_alloc(child, &virt, BUS_DMA_NOWAIT, &map); bus_dmamap_load(child, map, virt, 65536, map_request, NULL, 0); In the device detach, the code that frees up the memory if (virt != NULL) { bus_dmamap_unload(child, map); bus_dmamem_free(child, virt, map); bus_dmamap_destroy(child, map); } bus_dma_tag_destroy(child); bus_dma_tag_destroy(parent); I'm clearly doing something wrong, but I don't understand what the problem is. Any ideas? Thanks! -- Chuck Tuffli <chuck_tuffli AT NO_SPAM agilent DOT com> Agilent Technologies, Storage and Networking To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-hackers" in the body of the message