Date: Sun, 2 Jul 2006 14:33:30 +0200 From: Hans Petter Selasky <hselasky@c2i.net> To: Ian Dowse <iedowse@iedowse.com> Cc: David Malone <dwmalone@maths.tcd.ie>, freebsd-hackers@freebsd.org Subject: Re: contiguous memory allocation problem Message-ID: <200607021433.32278.hselasky@c2i.net> In-Reply-To: <200607021305.aa75873@nowhere.iedowse.com> References: <200607021305.aa75873@nowhere.iedowse.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sunday 02 July 2006 14:05, Ian Dowse wrote: > In message <200607021138.11945.hselasky@c2i.net>, Hans Petter Selasky writes: > >But there is one problem, that has been overlooked, and that is High speed > >isochronous transfers, which are not supported by the existing USB system. > > I don't think that the EHCI specification was designed for scatter and > > gather, when you consider this: > > > >8 transfers of 0xC00 bytes has to fit on 7 pages. If this is going to > > work, and I am right, one page has to contain two transfers. (see page 43 > > of ehci-r10.pdf) > > I haven't looked into the details, but the text in section 3.3.3 > seems to suggest that EHCI is designed to not require physically > contiguous allocations here either, so the same approach of using > bus_dmamap_load() should work: > > This data structure requires the associated data buffer to be > contiguous (relative to virtual memory), but allows the physical > memory pages to be non-contiguous. Seven page pointers are provided > to support the expression of 8 isochronous transfers. The seven > pointers allow for 3 (transactions) * 1024 (maximum packet size) > * 8 (transaction records) (24576 bytes) to be moved with this > data structure, regardless of the alignment offset of the first > page. 3 * 1024 bytes = 0xC00 bytes 8 * 0xC00 = 0x6000 bytes maximum According to this you need "6" "EHCI pages", because "6 * 0x1000 = 0x6000". The seventh "EHCI page" is just there to allow one to start at any page offset. There is no eight "EHCI page". The only solution I see, is to have a double layer ITD. The first layer have the 4 first transfers activated, and the second layer have the 4 last transfers activated. A little more complicated, but not impossible. --HPS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200607021433.32278.hselasky>