David

> Right, so what's the confusion, and why did you ask the first 
> question?

Well, you wrote that "NO, it always hold the queue head" which I
interpreted to mean the register contents are static. Anyway I am clear
about it now. Thanks for your explanation.

> The HCD doesn't touch that register after initialization, and 
> the only thing that's always _known_ to be in the async ring 
> is a QH that never holds transactions and is marked as the 
> queue head.  Even an "empty" ring will hold that QH.

Is this always_present QH also labeled as dummy QH ? What is purpose of
using this QH which never holds transactions ?

Similarly the code also has comments about dummy qtd. What is their
purpose  as well ?



> -----Original Message-----
> From: David Brownell [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, January 03, 2007 9:02 PM
> To: linux-usb-devel@lists.sourceforge.net
> Cc: Vivek Dharmadhikari
> Subject: Re: [linux-usb-devel] Linking and unlinking queue head
> 
> On Thursday 28 December 2006 4:41 pm, Vivek Dharmadhikari wrote:
> > 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 ?
> 
> Right, so what's the confusion, and why did you ask the first 
> question?
> 
> The HCD doesn't touch that register after initialization, and 
> the only thing that's always _known_ to be in the async ring 
> is a QH that never holds transactions and is marked as the 
> queue head.  Even an "empty" ring will hold that QH.
> 
> - Dave
> 
> 
> > 
> > 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=D
> > > EV
> > > > 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=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

Reply via email to