Hello David > > Is the Asynclistaddr register updated by the host controller after > > unlinking a queue head ? > > No, since it always holds the queue head. What happens > instead is that the controler is told to stop scanning the > async ring once it becomes empty, and stays empty for a while.
I am confused. Section 4.8 of echi specs says that " When the host controller completes processing of asynchronous schedule,it retains the value of last accessed queue head's horizontal pointer in the ASYNCLISTADDR register. Next time the asynchronous schedule is accessed, this is the first data structure that will be serviced" I interpret the above to mean that ASYNCLISTADDR is updated by the hardware. In other words, ASYNCLISTADDR may not always hold ehci->async. Is it correct ? Regards Vivek > -----Original Message----- > From: David Brownell [mailto:[EMAIL PROTECTED] > Sent: Wednesday, December 20, 2006 6:41 PM > To: linux-usb-devel@lists.sourceforge.net > Cc: Vivek Dharmadhikari > Subject: Re: [linux-usb-devel] Linking and unlinking queue head > > On Wednesday 20 December 2006 4:40 pm, Vivek Dharmadhikari wrote: > > Hello > > > > I want to understand how the queue heads are linked and unlinked in > > the ehci driver. I interpret following after reading the ehci code > > After you understand that, what will you do with that knowledge? > > > > 1. The class drivers such usb-stroage submit urb using > > usb_submit_urb() > > Yes, but not all USB device drivers are class drivers... > > > > 2. The usb core driver chops the urb into qtds. > > No, EHCI does that in qh_urb_transaction(). > > > > 3. The qtds are then linked into an existing queue head if any or > > otherwise a new queue head is created and then the qtds are linked > > into it. > > Yes, EHCI does this in submit_async() and qh_append_tds(); > the last step will be qh_link_async() if the QH is newly > created, or is otherwise in the IDLE state (controller > doesn't see it). > > Note that appending to an active queue head is tricky and racey. > > That's especially true given certain bugs in older EHCI > silicon, and the fact that the queue head may be in the > middle of fault cleanup (including cleanup from a > software-induced "unlink TDs associated with this URB" fault). > > > > 4. The host controller execute the transactions defined by the each > > qtd and generate QTD_IOC interrupt. > > Not every QTD involves an IOC though ... only the last TD > associated with an URB needs one. > > Also, getting a STS_INT completion interrupt just means > _some_ qtd (or itd) completed. The driver scans the schedule > and collects all the completed transfers. Many of those will > imply a completed URB; and taking the completed transfers off > the schedules is only slightly racey, that's actually pretty > easy. (What's harder is cleanup after faults, which can mean > putting a modified QH back on the async ring...) > > > > Is the above interpretation correct ? > > > > I am not sure how unlinking queue head happens though. I > suppose the > > queue head is unlinked after queue head scan reveals that > there are no > > pending qtds. Is that a fair assumption ? > > See what scan_async() does. It turns out to be a bad idea to > unlink a queue head (using the IAA mechanism) immediately > after its last QTD gets collected, since it takes time to > unlink and it's routine to submit a new URB to an endpoint > soon after the last one gets given back to the driver. So > instead of immediately unlinking, there's a delay. > > > > I understand that the queue heads are unlinked to reduce > memory chatter. > > Is there a way whereby the queue heads stays forever and are not > > unlinked at all ? > > Not in this driver. > > > > Is the Asynclistaddr register updated by the host controller after > > unlinking a queue head ? > > No, since it always holds the queue head. What happens > instead is that the controler is told to stop scanning the > async ring once it becomes empty, and stays empty for a while. > > - Dave > > > > > > Thanks. > > > > > > > ---------------------------------------------------------------------- > > --- Take Surveys. Earn Cash. Influence the Future of IT Join > > SourceForge.net's Techsay panel and you'll get the chance to share > > your opinions on IT & business topics through brief surveys > - and earn > > cash > > > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEV > > DEV _______________________________________________ > > linux-usb-devel@lists.sourceforge.net > > To unsubscribe, use the last form field at: > > https://lists.sourceforge.net/lists/listinfo/linux-usb-devel > > > ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel