On Feb 20, 2004, at 9:15 AM, Linus Torvalds wrote:

On Thu, 19 Feb 2004, David S. Miller wrote:
On Fri, 20 Feb 2004 18:10:41 +1100
Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote:

Hrm... so if the USB device drivers are actually doing the dma mapping
themselves, it make sense for them to pass their own struct device, no ?

That's right, at least that was the idea.

No. That would be _fundamentally_ wrong.


There's no way a USB device can do DMA in the first place. It has no DMA
controller, and no way to read/write memory except through the USB host.


So it is the host - and only the host - that matters. Anything else is a
bug.

Sure. So dma-mapping.h does this: int dma_supported(struct device *dev, u64 mask) { return device->bus->dma_supported(dev, u64 mask); }

And USB, when it creates its bus_type, does this:
int usb_dma_supported(struct device *dev, u64 mask) {
usb_dev *usbdev = to_usb_device(dev);
return usbdev->root_hub->controller->bus->dma_supported(controller, u64 mask)
}
And of then PCI has:
int pci_dma_supported(struct device *dev, u64 mask) {
pci_dev *pcidev = to_pci_dev(dev, u64 mask);
...
}


Then a USB driver uses its own usb_device->dev and it all ends up back at the PCI bus.

For PCI devices of course, device->bus->dma_supported() *is* pci_dma_supported(), so there's no middleman (as USB is above).

--
Hollis Blanchard
IBM Linux Technology Center



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to