> That helps. So a buffer used for device input should be allocated
> separately from anything written by the CPU, whereas a buffer used for
> device output can be shared with other data in a buffer allocated by
> kmalloc, but not on the stack.
Judging by this implementation from mips Doing so would be quite inefficient.
extern inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
size_t size, int direction)
{
if (direction == PCI_DMA_NONE)
BUG();
#ifndef CONFIG_COHERENT_IO
dma_cache_wback_inv((unsigned long)ptr, size);
#endif
return virt_to_bus(ptr);
}
It is probably best to allocate all buffers seperately.
> How does the DMA driver arrange to flush the CPU's cache before starting a
> DMA out operation? I didn't notice any particular code to do that in the
> UHCI HCD.
From hcd.c:
if (!(urb->transfer_flags & URB_NO_DMA_MAP)
&& hcd->controller->dma_mask) {
if (usb_pipecontrol (urb->pipe))
urb->setup_dma = dma_map_single (
hcd->controller,
urb->setup_packet,
sizeof (struct usb_ctrlrequest),
DMA_TO_DEVICE);
if (urb->transfer_buffer_length != 0)
urb->transfer_dma = dma_map_single (
hcd->controller,
urb->transfer_buffer,
urb->transfer_buffer_length,
usb_pipein (urb->pipe)
? DMA_FROM_DEVICE
: DMA_TO_DEVICE);
The calls to dma_map_single().
Regards
Oliver
-------------------------------------------------------
This SF.net email is sponsored by: Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel