Author: wmb Date: 2009-11-14 02:07:09 +0100 (Sat, 14 Nov 2009) New Revision: 1479
Modified: dev/usb2/hcd/ehci/qhtd.fth Log: OLPC trac 9423 - Rearranged the EHCI qh-done? routine to make the logic clearer and to add an initial delay before polling the queue header. Without that delay, USB probing fails. I think this might be a Via quirk, but I'm not sure.
Modified: dev/usb2/hcd/ehci/qhtd.fth =================================================================== --- dev/usb2/hcd/ehci/qhtd.fth 2009-11-14 01:05:23 UTC (rev 1478) +++ dev/usb2/hcd/ehci/qhtd.fth 2009-11-14 01:07:09 UTC (rev 1479) @@ -538,6 +538,7 @@ or ( done?' ) ;
+: poll-delay ( -- ) d# 50 " us" evaluate ; : qh-done? ( qh -- done? ) process-hc-status ( qh ) dup sync-qh ( qh ) @@ -545,19 +546,22 @@ ;
: done? ( qh -- usberr ) - begin - dup qh-done? ?dup 0= if ( qh ) - 1 ms - dup >qh-timeout ( qh timeout-adr ) - dup l@ 1- ( qh timeout-adr timeout' ) - dup rot l! ( qh timeout' ) - 0= ( qh timed-out? ) - dup if " Timeout" USB_ERR_TIMEOUT set-usb-error noop then ( qh timed-out? ) - then ( qh exit-loop? ) - until ( qh ) - drop ( ) + poll-delay \ This may be a VIA quirk - if we poll too soon, we never see the done bit + begin dup qh-done? 0= while ( qh ) + 1 ms + dup >qh-timeout ( qh timeout-adr ) + dup l@ 1- ( qh timeout-adr timeout' ) + dup rot l! ( qh timeout' ) + 0= if ( qh ) + " Timeout" USB_ERR_TIMEOUT set-usb-error ( qh ) + drop ( ) + usb-error ( usberr ) + exit + then + repeat ( qh ) + drop ( )
- usb-error + usb-error ( usberr ) ;
: qtd-error? ( qtd qh -- usberr )